如果属性已经具有另一个属性,则强制在属性上使用该属性

本文关键字:属性 如果 另一个 | 更新日期: 2023-09-27 18:21:58

如果使用另一个attribute,我想强制使用attribute。如果一个特殊的第三方attribute连接到一个property,那么这个attribute也需要给一个property。有可能这样做吗?

例如:

[Some3rdPartyAttribute("...")]
[RequiredAttribute("...)]
public bool Example{get; set;}

应该不会带来编译错误,

[Some3rdPartyAttribute("...")]
public bool Example{get; set;}

应带来编译错误或警告。

attribute本身的定义与http://msdn.microsoft.com/en-US/library/z919e8tw(v=vs.80).aspx本身。但是,如果使用另一个attribute,如何强制使用attribute

如果属性已经具有另一个属性,则强制在属性上使用该属性

很遗憾,您无法从属性生成自定义编译器警告。某些属性(如System.ObsoleteAttribute)会生成警告或错误,但这是硬编码到C#编译器中的。你应该为你的问题找到另一个解决方案,也许让Some3rdPartyAttribute继承RequiredAttribute

否则,您必须更改编译器。

另一个选项是使用一些AOP技术。例如:

PostSharp。

使用它,您可以在编译时分析yur代码,如果某些条件不符合您的要求,则会发出错误。

关于属性的具体示例,可以查看:

PostSharp 2.1:反射自定义属性

您可以制作一个控制台应用程序,它将通过反射在程序集中的所有类型中迭代,检查规则是否满足,如果满足则返回0,如果规则被破坏则返回一些其他错误代码和输出错误。

然后让这个控制台应用程序作为构建后任务运行。

据我所知,在编译时没有办法检查属性。

我最近需要强制执行类似的东西(从某个基类派生的所有类都需要特定的属性)。最后,我使用反射对基类的构造函数进行了手动检查(使用[Conditional("DEBUG")])。这样,每当有人创建一个缺少属性的类的实例时,他们就会得到一个异常。但是,如果您的类不是都派生自同一个类,那么这可能不适用于您的情况。

您可以编写一些在应用程序启动时运行的代码,该代码使用反射,然后如果在没有正确匹配的情况下使用属性,则会引发运行时异常,但我相信这是您所能做到的,我个人认为这不是一个好方法,因为您需要运行一次应用程序以确保它符合您的规则。

此外,请查看PostSharp,它可能会对您有所帮助。

使用#warning+单元测试怎么样?通过这种方式,无论何时运行单元测试,都会生成一个警告(或者您可以使用Debug.Fail而不是#warning)

相关文章: