属性类的继承如何在C#中起作用?为了澄清,我说的是属性类本身的继承(即System.Attributes
的基类),而不是任何碰巧将它们作为属性的类。
出于某种原因,我似乎无法在此找到任何内容(我的搜索总是出现其他含义)。
例如,如果一个类AttributeA
扩展为System.Attribute
:
我是否必须使用AttributeA
分别标记[AttributeUsage()]
的子类。 (由于System.AttributeUsage
的继承是true
,我认为我不会。)
AllowMultiple=false
的{{1}}上的AttributeUsage
会阻止我为AttributeA
提供多个子类属性吗?
编辑:
程序员只能阅读代码。
AttributeA
这有用吗?
答案 0 :(得分:1)
(我终于可以尝试了。)
示例代码确实编译。我仍然喜欢有文档,虽然我认为C#是C#并且它不会改变它。 (右?)
显然:
AttributeUsage
。AllowMultiple
仅将 引用(严格地说)原始类的属性,而不是子类。AttributeUsage
可以有效地“重新定义”。 使用
[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.