是否有标准框架(可能是Enterprise Library ...或.NET本身的一部分),允许您在方法属性中进行通用参数验证?
答案 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)
Dynamic Data允许您使用属性对模型属性进行验证。
答案 4 :(得分:1)
您还可以使用postsharp并实现自己的属性进行验证。
答案 5 :(得分:1)