C#属性类的继承

时间:2013-04-19 22:40:06

标签: c# .net inheritance custom-attributes

属性类的继承如何在C#中起作用?为了澄清,我说的是属性类本身的继承(即System.Attributes的基类),而不是任何碰巧将它们作为属性的类。

出于某种原因,我似乎无法在此找到任何内容(我的搜索总是出现其他含义)。

例如,如果一个类AttributeA扩展为System.Attribute

  1. 我是否必须使用AttributeA分别标记[AttributeUsage()]的子类。 (由于System.AttributeUsage的继承是true,我认为我不会。)

  2. AllowMultiple=false的{​​{1}}上的AttributeUsage会阻止我为AttributeA提供多个子类属性吗?

  3. 编辑:

    程序员只能阅读代码。

    AttributeA

    这有用吗?

3 个答案:

答案 0 :(得分:1)

(我终于可以尝试了。)

示例代码确实编译。我仍然喜欢有文档,虽然我认为C#是C#并且它不会改变它。 (右?)

显然:

  1. 子类按预期继承AttributeUsage
  2. AllowMultiple仅将 引用(严格地说)原始类的属性,而不是子类。
  3. 此外,AttributeUsage可以有效地“重新定义”。
  4. 使用

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    class AttributeA : Attribute
    { }
    
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
    class AttributeB : AttributeA
    { }
    
    class AttributeC : AttributeA
    { }
    

    以下是可以的

    [AttributeA]
    [AttributeB]
    [AttributeB]
    [AttributeC]
    class Foo
    { }
    

    但这不是

    [AttributeA]
    [AttributeB]
    [AttributeC]
    [AttributeC]
    class Foo
    { }
    

答案 1 :(得分:1)

您可以使用对AttributeUsageAttribute继承的命名参数来控制此行为。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
class AttributeA
{ }

class AttributeB : AttributeA
{ }

class AttributeC : AttributeA
{ }

答案 2 :(得分:0)

属性用法适用于使用属性的类。

例如,如果使用AttributeA标记类A并且类B是A的子类,则如果AttributeA AttributeUsage的继承为true,则不需要使用AttributeB标记类B.