【问题标题】:Force the usage of an attribute on properties, if they already have another attribute如果属性已经有另一个属性,则强制对属性使用属性
【发布时间】:2013-07-10 09:08:45
【问题描述】:

如果使用了另一个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

【问题讨论】:

    标签: c# custom-attributes


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      PostSharp

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

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

      PostSharp 2.1: Reflecting Custom Attributes

      【讨论】:

      • 我喜欢 AOP/IOC 的答案,遗憾的是我无法向老板解释...
      • @Offler:AOP 并不适合所有事情。考虑一个事实,是的,它在以声明性方式自动化任务方面有很大帮助,因此您的代码要少得多。但另一方面,它将行为隐藏在其中,因此不熟悉它的人,或者当应用程序变得非常复杂时,可能会导致复杂性处理问题。因此,如果您要使用它,请明智地使用它。
      • 这就是我的意思,我很难向我的老板解释 AOP 的用法。我也希望它用于其他一些事情,例如日志记录......
      【解决方案3】:

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

      否则你必须更改编译器。

      【讨论】:

      • 谢谢。第 3 方属性(不是来自我们)几乎不会从我们所需的属性继承,如果使用第 3 方功能,这将迫使程序员提供一些附加信息。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        另外,看看 PostSharp 可能会对您有所帮助。

        【讨论】:

        • 我不想在运行时更改它们。如果属性不存在,我只希望在编译时出现警告或错误
        • 我已经编辑了我的答案,因为最初的评论有点脱离上下文。无论如何,如果不使用反射并在运行时引发错误,我自己看不到其他选项。
        【解决方案6】:

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

        【讨论】:

        • 我不知道如何仅在一个属性存在而另一个属性没有正确文本时以编程方式显示警告?
        • 如果您正在使用单元测试,这可以很容易地完成...只需检查方法是否具有这两个属性,如果没有则显示警告。或者您可以使用一种测试方法来检查所有使用一个属性的方法是否还具有其他必需的属性
        猜你喜欢
        • 2017-08-28
        • 2016-07-13
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 2017-06-07
        • 2011-05-09
        • 2016-06-02
        相关资源
        最近更新 更多