Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有使用属性的.NET参数验证标准框架?_C#_.net_Validation_Attributes_Parameters - Fatal编程技术网

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

C# 是否有使用属性的.NET参数验证标准框架?,c#,.net,validation,attributes,parameters,C#,.net,Validation,Attributes,Parameters,是否有一个标准框架(可能是企业库的一部分…或.NET本身)允许您在方法属性中执行公共参数验证?用于ASP.NET(和ASP.NET MVC)允许您使用属性对模型属性进行验证。Microsoft企业库具有Microsoft.Practices.EnterpriseLibrary.validation库/命名空间,允许使用属性进行验证。您还可以使用并实现自己的属性进行验证。,自4.0 CTP以来一直是.NET Framework的一部分,并且作为独立软件包可用于早期的.NET Framework版本

是否有一个标准框架(可能是企业库的一部分…或.NET本身)允许您在方法属性中执行公共参数验证?

用于ASP.NET(和ASP.NET MVC)允许您使用属性对模型属性进行验证。

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

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

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

参数检查的一个示例是(复制自):

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

编辑:刚刚注意到,您特别要求使用属性进行参数检查的库。。。但代码并不如此。代码契约不使用属性的原因列在其:

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

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

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

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


下面是一个使用PostSharp的示例

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

尝试使用Contract.Requires()并收到一条消息:我应该安装CCRewrite并设置一些神秘的CONTRACTS\u FULL symbol。我觉得这实际上不应该用作简单的运行时参数验证
public Rational(int numerator, int denominator)
{
    Contract.Requires(denominator ! = 0);
    
    this.numerator = numerator;
    this.denominator = denominator;
}