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

Eri*_*ver 8 .net c# validation parameters attributes

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

Dar*_*der 7

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


Chr*_*ian 4

Microsoft 代码契约自 4.0 CTP 起成为 .NET Framework 的一部分,并且可作为独立包用于早期 .NET Framework 版本,允许指定编码假设。这包括指定可以验证参数的前提条件。

参数检查的一个示例用途是(从代码合同文档复制):

public Rational(int numerator, int denominator)
{
    Contract.Requires(denominator ! = 0);
    
    this.numerator = numerator;
    this.denominator = denominator;
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:刚刚注意到您特别要求一个使用属性进行参数检查的库......而代码契约则没有。代码合约不使用属性的原因在其常见问题解答中列出:

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

运行时支持:如果不依赖于二进制重写器,则无法在运行时强制执行用属性表示的契约。这意味着,如果您希望在运行时强制执行先决条件(或其他契约),则需要在代码中复制这些契约,或者在构建过程中包含二进制重写器。Contract.RequiresAlways 既充当声明性契约,又充当运行时检查的验证。

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

缺乏 IDE 支持:以字符串表示,不支持 Intellisense、类型检查或重构,所有这些都可用于将合约编写为代码。