【问题标题】:Can a custom attribute imply other attributes without inheritance?自定义属性可以隐含其他没有继承的属性吗?
【发布时间】:2010-11-20 23:39:11
【问题描述】:

我正在编写一些库代码,使用该代码的类需要指定两个属性(一个自定义属性和一个来自 .NET)。

记录此要求并将这两个属性复制并粘贴到使用我的库的每个类上有点麻烦,所以我认为让我的自定义属性只暗示另一个属性的存在可能会更好.不过,.NET 框架的另一个属性是密封的,所以我不能只继承它......

那么有没有办法做到这一点?我可以在运行时添加 .NET 属性吗?

谢谢。

【问题讨论】:

  • 你能告诉我们.Net属性是什么吗?
  • System.ServiceModel.XmlSerializerFormatAttribute

标签: c# .net inheritance attributes


【解决方案1】:

虽然您可以在属性中使用继承,但它是recommended you don't

由于这只是一个性能规则,您不会违反正确性,但它可能会造成一些混乱,您必须花费大量精力来确保您不会违反基本属性的语义。如果您尝试使用 AttributeUsage 标志扩展属性的可能位置,则可能会导致问题。相关属性的规则是quite complex

一个方法可以应用两个属性中的任何一个,但不能同时应用。任何未应用的操作都使用应用于包含类的属性。如果包含的类没有应用任何属性,则使用 DataContractSerializer。

将其密封起来听起来像是他们的明智计划。此 API 在设计时并未考虑到此类扩展。

没有办法(缺少 AOP 风格的“代码注入”)在运行时向现有类添加属性。

【讨论】:

  • 这是有道理的。我将保持运行时检查以强制执行要求。
【解决方案2】:

我不相信有一种方法可以暗示次要属性或在运行时添加属性。但是,您可以在添加属性时使用自定义代码模板将属性添加到每个类。和/或对于已经开发的类,我怀疑您可以编写一个遍历每个文件并将属性添加到类的宏,但是我过去没有这样做,所以我不确定它会带来什么,我知道制作代码模板以将属性添加到类声明中相对简单。但这仅适用于您从添加模板开始添加的类。如果您还需要对旧类进行清理,如果您有很多文件/类需要这样做,我会研究宏。或者如果没有太多,手动做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 2011-01-31
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多