代码之家  ›  专栏  ›  技术社区  ›  Horosho

为什么自定义类型属性没有在泛型中继承?

  •  1
  • Horosho  · 技术社区  · 8 年前

    我有属性

    [AttributeUsage(AttributeTargets.Class)]
    public class CacheAttribute : Attribute
    {        
    }
    

    和泛型类

    [Cache]    
    public class BaseClass<T>
    {        
    }
    

    和另一类

    public class ImplClass : BaseClass<Type>
    {        
    }
    

    当我试图从中获取自定义属性时

    BaseClass<Type>
    

    我得到我的属性,但不是来自

    ImplClass 
    

    获取自定义属性的代码是

    typeof(ImplClass).CustomAttributes -> 0
    typeof(BaseClass<Type>).CustomAttributes -> 1
    

    如何将属性继承到实现中?

    注: 有一个类似的问题 How does inheritance work for Attributes? 那就是 没有帮助 . 与这个问题不同,这个问题是关于属性继承与泛型的结合。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Streamline    8 年前

    您的属性 是 由您的子类继承。您遇到的问题不是泛型特有的。它可以很容易地用非泛型类型复制:

    using System.Linq;
    
    [AttributeUsage(AttributeTargets.Class)]
    public class FooAttribute : Attribute
    {
        private readonly string name;
    
        public FooAttribute(string name)
        {
            this.name = name;
        }
    }
    
    [Foo("bar")]
    public class Base { }
    public class Child : Base { }
    
    Console.WriteLine(typeof(Base).CustomAttributes.Count());  // Prints 1.
    Console.WriteLine(typeof(Child).CustomAttributes.Count()); // Prints 0.
    

    来自以下文件: MemberInfo.CustomAttributes :

    获取包含此成员的自定义属性的集合。

    因此,此属性只获取应用于类型本身的属性,而不是继承的属性(中的实现 MemberInfo 电话 GetCustomAttributesData 这反过来又会 NotImplementedException 我在中找不到覆盖 Type 所以我假设这是对的)。

    但是,您可以使用 MemberInfo.GetCustomAttributes 重载或以下之一 these 获取继承属性的扩展方法

    typeof(ImplClass).GetCustomAttributes(typeof(CacheAttribute), inherit: true)