【问题标题】:How can I require an attribute on a class definition?我如何要求类定义中的属性?
【发布时间】:2010-05-24 17:26:59
【问题描述】:

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

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

有这种事吗?

【问题讨论】:

    标签: .net attributes


    【解决方案1】:

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

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

    【讨论】:

    • +1 我为此进行了第二次单元测试,易于编写,虽然不会让编译器抱怨,但它会及早提醒您缺少信息。
    【解决方案2】:

    可以在运行时通过反射实现。

    这是一个适合你的单元测试方法:

    ...
    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") 属性以确保它仅在调试模式下执行。
    (因为反射不快,而且在生产模式下运行它真的没有意义,是吗?)

    【讨论】:

    • 在您的单元测试中针对生产代码运行它是有意义的。你为什么要让它有条件并将测试本身放在你的生产代码中?
    • @Jon - 我编辑了它,现在它是一个单元测试。现在有意义吗? :P
    • 除了您正在测试执行程序集之外的所有内容,这是一个单元测试程序集,因此不太可能成为您的生产代码:)(我会使用typeof(SomeWellKnownType).Assembly。)
    • @Jon - 感谢您的审阅,现已全部修复。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2019-02-26
    • 2019-09-21
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多