gpt4 book ai didi

c# - 自定义属性类是否继承 "Inherited"AttributeUsage 标志?

转载 作者:太空狗 更新时间:2023-10-29 22:01:14 27 4
gpt4 key购买 nike

考虑以下场景:

  • 基本属性类 BaseAttribute有一个 AttributeUsageAttribute指定它不可继承 ( Inherited = False )。
  • 派生属性类 DerivedAttribute继承自该基本属性类。
  • 基域类 Base已应用派生属性。
  • 域类 Derived从基域类继承要求其自定义属性,包括继承的属性 ( inherit: true )。

对应的代码如下:

using System;
using System.Linq;

namespace ConsoleApplication26
{
class Program
{
static void Main ()
{
var attributes = typeof (Derived).GetCustomAttributes (true);
foreach (var attribute in attributes)
{
Console.WriteLine (
"{0}: Inherited = {1}",
attribute.GetType().Name,
attribute.GetType().GetCustomAttributes (typeof (AttributeUsageAttribute), true).Cast<AttributeUsageAttribute>().Single().Inherited);
}
}
}

[AttributeUsage (AttributeTargets.All, Inherited = false)]
public class BaseAttribute : Attribute
{
}

public class DerivedAttribute : BaseAttribute
{
}

[Derived]
public class Base
{
}

public class Derived : Base
{
}
}

在这种情况下,GetCustomAttributes API 返回 DerivedAttribute 的一个实例类(class)。我原以为它不会返回那个实例,因为 http://msdn.microsoft.com/en-us/library/system.attributeusageattribute.aspxAttributeUsageAttribute本身是可继承的。

现在,这是一个错误,还是在某处预期/记录?

注意(2013-02-20):实验表明AttributeTargets BaseAttribute 的一部分类确实由 DerivedAttribute 继承类(class)。例如,当我更改 BaseAttribute 上允许的目标时至 AttributeTargets.Method ,C# 编译器不允许我应用 DerivedAttribute上课。因此,Inherited = false 没有意义部分未被 DerivedAttribute 继承,因此我倾向于认为 GetCustomAttributes 的实现中存在错误.

最佳答案

根据 .NET 4.0 中的元数据,AttributeUsageAttribute 类被标记为 [AttributeUsage(AttributeTargets.Class, Inherited = true)]。因此,如果您的属性类(在您的示例中为 BaseAttribute)应用了一个 AttributeUsageAttribute(所有 Attribute 类都应如此,但不要'如果他们不破坏任何东西 - 见下文),那么从 BaseAttribute 派生的任何类都应该继承应用于它的 AttributeUsage 属性。

您的 Derived 类从 Base 继承了 DerivedAttribute,因为 DerivedAttribute 没有自己的 AttributeUsageAttribute 应用于它,因此反射 API 依赖于 BaseAttribute 的属性。现在,从 BaseAttribute 类中取出 AttributeUsageAttribute,您会得到相同的结果,因为基础 System.Attribute 类标有 [AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)]。因此,任何属性类都将继承此属性,除非您指定一个不同的属性。

哇,这些都是复杂的段落。属性上的属性需要大量阅读 :P

关于c# - 自定义属性类是否继承 "Inherited"AttributeUsage 标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955406/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com