10

attribute如果使用另一个,我想强制使用一个attributeattribute如果 a附加了一个特殊的 3rd 方property,这attribute也需要给 a 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使用?

4

6 回答 6

4

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

否则你必须改变编译器。

于 2013-07-10T09:13:54.673 回答
3

另一种选择是使用一些 AOP 技术。例如:

后夏普

使用它,您可以在编译时分析您的代码并在某些条件不满足您的要求时发出错误。

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

PostSharp 2.1:反映自定义属性

于 2013-07-10T09:17:49.010 回答
1

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

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

于 2013-07-10T09:20:26.567 回答
0

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

另外,看看 PostSharp 可能对你有帮助。

于 2013-07-10T09:16:11.657 回答
0

使用#warning + 单元测试怎么样?这样,每当您运行单元测试时,都会生成警告(或者您可以只使用 Debug.Fail 而不是#warning)

于 2013-07-10T09:18:10.413 回答
0

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

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

于 2013-07-10T10:00:42.410 回答