6

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

出于某种原因,我似乎在这方面找不到任何东西(我的搜索总是以其他含义出现)。

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

  1. 我是否必须单独标记AttributeAwith的子类[AttributeUsage()]?(由于System.AttributeUsage的继承是true,我想我不会。)

  2. 会阻止我拥有多个for 属性AllowMultiple=false子类吗?AttributeUsageAttributeAAttributeA

编辑:

程序员只能阅读代码。

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

class AttributeB : AttributeA
{ }

class AttributeC : AttributeA
{ }

[AttributeB]
[AttributeC]
class Foo
{ }

这行得通吗?

4

3 回答 3

1

(我终于可以尝试了。)

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

显然:

  1. AttributeUsage正如预期的那样,子类继承。
  2. AllowMultiple仅指(严格)原始类的属性,而不是子类
  3. 而且,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
{ }
于 2013-04-19T23:09:28.953 回答
1

您可以通过为 AttributeUsageAttribute 使用命名参数 Inherited 来控制此行为。

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

class AttributeB : AttributeA
{ }

class AttributeC : AttributeA
{ }
于 2014-07-19T21:01:10.220 回答
0

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

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

于 2013-04-19T22:50:14.647 回答