2013-07-10 78 views
10

如果使用其他属性,我想强制使用属性。 如果一个特殊的第三方属性附加到一个属性,这个属性也需要给一个属性 有没有可能这样做?强制使用属性属性(如果它们已具有其他属性)

例如:

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

应该让没有编译错误,

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

应该把编译错误或警告。

属性本身的肺癌等从http://msdn.microsoft.com/en-US/library/z919e8tw(v=vs.80).aspx本身的例子。但是,如果使用另一个属性,如何强制使用该属性?

回答

2

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

PostSharp

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

有关属性的具体的例子,可以一看:

PostSharp 2.1: Reflecting Custom Attributes

+0

我喜欢的AOP/IOC的答案,遗憾的是那是后话我很难解释我的老板... – Offler

+0

@Offler:AOP是不好的一切。考虑一个事实,是的,它以声明的方式帮助你自动完成任务,所以你的代码少得多。但另一方面,它隐藏了它内部的行为,所以不熟悉它的人或者应用程序变得相当复杂时会导致复杂性处理问题。所以如果你要使用它,明智地使用它。 – Tigran

+0

这就是我的意思,我很难解释AOP对我老板的用法。此外,我想它的一些其他的东西,如日志记录.... – Offler

4

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

否则,你必须改变编译器。

+0

thx。第三方属性(不是来自我们)很难继承我们所需的atrribute,如果使用第三方功能,应该强制程序员给出一些addditioanl信息。 – Offler

0

你可以写在应用程序启动运行的一些代码,使用反射,然后会抛出运行时异常如果属性是不正确的匹配使用,但我相信这是就可以去,我个人不认为一个好的方法,因为您需要运行一次该应用程序以确保它符合您的规则。

而且,看看PostSharp它可以帮助你。

+0

我不想在运行时更改它们。我只想在编译期间出现一个警告或错误,如果不存在一个问题 – Offler

+0

我已经编辑了我的答案,因为这个初始评论有点不符合上下文。在任何情况下,如果不在运行时使用反射和引发错误,我自己也看不到其他选项。 – 2013-07-10 10:25:14

0

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

+0

我不知道如何以编程方式显示警告只有当一个属性是存在的,而另一个是不正确的文本? – Offler

+0

如果你正在使用单元测试,这可以很容易地完成...只是检查方法是否有两个属性,并显示警告,如果它不。或者您可以使用一种测试方法来检查是否所有使用一个属性的方法都具有其他必需的属性 –

0

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

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

0

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

我最近需要执行类似(从某个基类派生的所有类需要一定的属性)。我结束了使用反射到基类的构造函数手动检查(与[Conditional("DEBUG")])。这样,每当有人创建一个缺少属性的类的实例时,他们就会得到一个异常。但是,如果你的班级不是全部来自同一班级,这可能不适用于你的情况。

相关问题