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