Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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#属性限制_C#_.net 2.0_Attributes - Fatal编程技术网

C#属性限制

C#属性限制,c#,.net-2.0,attributes,C#,.net 2.0,Attributes,是否可以限制在特定类中应用属性的属性数?我认为在编译时是不可能的。但是您可以将一些代码添加到实例构造函数或静态构造函数中,该构造函数在运行时通过反射进行检查。在编译时否 在运行时,您可以通过一个静态初始化器来验证这一点,如果违反了该不变量,该初始化器将抛出该不变量,尽管这将被认为是非常糟糕的样式,但从某种意义上说,如果不变量不存在,则没有代码可以执行,这将是安全的 如果您考虑.Net固有的可扩展性,即使您可以在编译时对此进行验证,请想象: 使用 public class Foo {

是否可以限制在特定类中应用属性的属性数?

我认为在编译时是不可能的。但是您可以将一些代码添加到实例构造函数或静态构造函数中,该构造函数在运行时通过反射进行检查。

在编译时否

在运行时,您可以通过一个静态初始化器来验证这一点,如果违反了该不变量,该初始化器将抛出该不变量,尽管这将被认为是非常糟糕的样式,但从某种意义上说,如果不变量不存在,则没有代码可以执行,这将是安全的

如果您考虑.Net固有的可扩展性,即使您可以在编译时对此进行验证,请想象:

使用

public class Foo 
{
     public int Property1 {get;}
} 
使用类引用A.dll编译dll B

public class Bar
{
     [OnlyOneAllowedOnAnyPropertiesPerClass]
     public int Property2 {get;}
} 
然后用

public class Foo 
{
     [OnlyOneAllowedOnAnyPropertiesPerClass]
     public int Property1 {get;}
} 
并尝试用旧的B.dll运行这个新的A.dll(它们在所有其他方面都是二进制兼容的,所以这很好)

显然,运行时必须做大量的工作来检查这一点,更不用说B可能在一段时间内没有被加载,突然使A和B中的一个或两个“非法”

因此,您不应该期望该功能在框架中可用。

如果在编译时(或之后)很重要,您应该为属性创建一个规则或自定义搜索(类似于[OnlyOnceAttribute]的模式)


findstr实用程序返回匹配的行。您只需要一个批处理文件来捕获行计数和调用方的错误(=MSBuild任务),生成就会失败。

这主意不错,但请注意,分部类和继承都会破坏这一点,文件中的多个类会导致误报。只要您能够以编译后的形式访问整个代码库,就可以使用正确的FxCop规则。否。你为什么要这样做?
findstr "[OnlyOnceAttribute]" *.cs