是否有使用属性的.NET参数验证的标准框架?

时间:2008-09-26 07:23:39

标签: c# .net validation attributes parameters

是否有标准框架(可能是Enterprise Library ...或.NET本身的一部分),允许您在方法属性中进行通用参数验证?

6 个答案:

答案 0 :(得分:7)

Microsoft Enterprise Library具有Microsoft.Practices.EnterpriseLibrary.Validation库/命名空间,允许使用属性进行验证。

答案 1 :(得分:4)

Microsoft Code Contracts,它是.NET Framework自4.0 CTP以来的一部分,并且作为独立程序包可用于早期的.NET Framework版本,允许指定编码假设。这包括指定可以验证参数的前置条件。

参数检查的一个示例用法是(从Code Contracts documentation复制):

public Rational(int numerator, int denominator)
{
    Contract.Requires(denominator ! = 0);

    this.numerator = numerator;
    this.denominator = denominator;
}

使用代码契约的好处在于它是一个将成为未来.NET Framework版本的一部分的库,因此迟早会在应用程序中减少一个依赖项。

编辑:刚刚注意到您特别要求使用属性进行参数检查的库...代码合同没有。代码合约不使用属性的原因列在FAQ

  

使用自定义属性的优点是它们根本不会影响代码。但是,使用方法调用的好处远远超过看似自然的首选属性:

     

运行时支持:不依赖于二进制重写器,在运行时无法强制使用属性表示的合同。这意味着如果您希望在运行时强制执行前提条件(或其他合同),则需要复制代码中的合同,或者在构建过程中包含二进制重写器。 Contract.RequiresAlways既可以作为声明性合同,也可以作为运行时检查验证。

     

需要解析:由于可以与自定义属性一起使用的值有限,因此条件最终会被编码为字符串。这需要定义适合所有源语言的新语言,需要解析字符串,复制编译器已经拥有的所有功能。

     

缺乏IDE支持:以字符串形式表示,不支持Intellisense,类型检查或重构,所有这些都可用于创作合同作为代码。

答案 2 :(得分:2)

虽然Microsoft Code Contracts已暂停一段时间,但它们仍然托管在MS Research中,您无法使用配置(app.config /数据库等)来打开/关闭甚至更改规则。我的库Bouncer确实提供了声明规则定义:源代码中的属性或实体类/属性级别的规则的app.config条目。该库是LGPL下的开源软件(您可以在商业产品中自由使用它)。如果通过app.config配置规则,则可以调整规则设置,而无需重新编译。

答案 3 :(得分:1)

ASP.NET(和ASP.NET MVC)的

Dynamic Data允许您使用属性对模型属性进行验证。

答案 4 :(得分:1)

您还可以使用postsharp并实现自己的属性进行验证。

答案 5 :(得分:1)