C# 验证给定给方法c的输入参数#

C# 验证给定给方法c的输入参数#,c#,validation,reflection,C#,Validation,Reflection,我有一组方法,所有这些方法都接受不同数据类型的各种参数,我试图实现的是调用另一个方法的方法,传递当前方法接受的所有参数及其值,在该方法中,我最终将根据参数的数据类型进行不同类型的验证。我的想法是,我将有一个验证方法,我将能够在每个方法的开始调用,而不是遍历每个方法,并在每个方法中一次验证一个参数。下面是我试图实现的大致轮廓,我环顾四周,似乎发现了反射的一些用途,但传递参数类型及其值似乎有点棘手,我想知道是否还有其他人遇到过类似的问题 public void doStuffA(int a, str

我有一组方法,所有这些方法都接受不同数据类型的各种参数,我试图实现的是调用另一个方法的方法,传递当前方法接受的所有参数及其值,在该方法中,我最终将根据参数的数据类型进行不同类型的验证。我的想法是,我将有一个验证方法,我将能够在每个方法的开始调用,而不是遍历每个方法,并在每个方法中一次验证一个参数。下面是我试图实现的大致轮廓,我环顾四周,似乎发现了反射的一些用途,但传递参数类型及其值似乎有点棘手,我想知道是否还有其他人遇到过类似的问题

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
}

你的问题是正确的

也许您可以进行两层验证。 第一层验证将用作默认的验证层。 该层将执行验证以处理空值、空字符串等

我同意这不是business objects的责任,尽管评论这篇文章的人继续主张将关注点分离

关注点分离是有效的,并且可以通过将此需求视为管理应用程序逻辑而非业务对象的交叉关注点来合理地执行

在这种情况下,考虑使用面向方面编程作为解决这个问题的技术。 如果您使用.NET或WinRT,我相信您可以提供此解决方案。 具体来说,您希望利用此工具提供的OnMethodBoundary特性。 在将此属性应用于方法或类时,您为应用程序提供了在执行方法之前和/或执行方法之后执行逻辑的能力

此方法将用作参数断言、日志记录、安全性等的解决方案。

您应该签出。它确实支持代码、属性和配置验证

验证应用程序块的设计允许您轻松验证对象。在许多情况下,可以用一行代码验证对象。您可以使用类中的属性定义验证规则:

[StringLengthValidator(0, 20)]
public string CustomerName;

除了使用内置的validation attributest,您还可以很容易地实现自己的自定义验证器。

我不建议这样做。您将失去通过静态分析审核参数验证的能力。首先:您将验证参数,而不是参数。话虽如此,我同意上面戴的观点。此外,如果您的类遵循单一责任原则,那么它们可能不会太大,以至于它们的方法不会从泛型参数验证中受益。更不用说“你很可能会靠墙编程,使代码重构几乎不可能。拜托,拜托,拜托。”。不要这样做。您可以在可以调用的方法中创建一些默认检查,但不希望有一个方法验证所有其他方法。转移责任是错误的。你们需要查看我对这个有效问题的答案。