如何在类定义上需要属性?

时间:2010-05-24 17:26:59

标签: .net attributes

有没有办法对类或接口实现上的某些属性强制执行编译要求?

例如,假设我的应用程序使用一系列包含const int资源值的静态类。我想在Description属性中装饰该类来描述其内容。在概念上,我想将此属性要求应用于接口,然后每个静态类将使用其所需的Description来实现它。我可以编写运行时检查或单元测试来检查合规性。但实际上编译时检查最好。

有这样的事吗?

2 个答案:

答案 0 :(得分:6)

不,没有这样的。据我所知,单位测试是你能做的最好的。

如果您可以自动识别类(按名称或该类装饰的其他属性),那么您可以轻松地为程序集中的所有类编写单元测试。

答案 1 :(得分:1)

可以在运行时通过Reflection。

以下是您的单元测试方法:

...
using System.Reflection;
using System.Diagnostics;
using System.Linq;
...

[TestMethod]
public void CheckAttributes()
{
    var notAttributed = Assembly.GetAssembly(typeof(SomeClass))
        .GetTypes()
        .Where(t => t.GetCustomAttributes(typeof(MyAttribute), true).Count() == 0);

    Assert.AreEqual<int>(0, notAttributed.Count());
}

MyAttribute是您的属性的类型,SomeClass是您要检查的程序集中的类。
您可能还希望过滤要以此方式检查的类型。 (当然,只有当你不要求程序集中的每个类都使用该属性时。)


如果您想在生产代码中执行此操作,请在其上放置Conditional("DEBUG")属性以确保它仅在DEBUG模式下执行。
(因为反射速度不快,在生产模式下运行它真的没有意义,是吗?)