所以我有很多方法,所有这些方法都接受不同数据类型的各种参数,我试图实现的是调用另一个方法,传入当前方法接受的所有参数及其值,在该方法中,我最终将根据参数的数据类型进行不同类型的验证。我的想法是,我将有一个验证方法,我将能够在每个方法的开头调用它,而不是遍历每个方法并在每个方法中一次一个地验证参数。以下是我试图实现的目标的大致概述,我环顾四周,似乎发现了反射的一些用途,但传递参数类型及其值似乎有点棘手,我想知道是否有其他人遇到过类似的问题。
public void doStuffA(int a, string b, string c, bool d)
{
var params = ?
if (validateInput(params))
{
// do stuff
}
}
public void doStuffB(string x, string y, int z)
{
var params = ?
if (validateInput(params))
{
// do stuff
}
}
public bool validateInput(? params)
{
// do validation
}
您应该签出Enterprise Library Validation Application块。它确实支持代码、属性和配置验证。
验证应用程序块的设计目的是使您能够轻松地验证对象。在许多情况下,您可以使用一行代码来验证对象。您可以使用类中的属性来定义验证规则:
[StringLengthValidator(0, 20)]
public string CustomerName;
除了使用内置的验证属性外,还可以很容易地实现自己的自定义验证器。
您的问题是一个有效的问题。
也许您可以进行几层验证。第一层验证将作为默认验证层。该层将执行验证以处理空值、空字符串等。
我同意这不是商业对象的责任,尽管评论这篇帖子的人仍然主张分离关注点。
关注点分离是有效的,并且可以通过将此需求视为应用程序逻辑管理的交叉关注点而非业务对象来合理地执行。
在这种情况下,可以考虑使用面向方面编程来解决这个问题。
我相信如果您使用.NET或WinRT,PostSharp可以为您提供此解决方案。特别是,您希望利用此工具提供的OnMethodBoundary方面。当将此属性应用于方法或类时,您为应用程序提供了在方法执行之前和/或方法执行之后执行逻辑的能力。
这种方法将作为参数断言、日志记录、安全性等的解决方案。