代码之家  ›  专栏  ›  技术社区  ›  Rodrick Chapman

如何从基类调用getCustomAttributes?

  •  1
  • Rodrick Chapman  · 技术社区  · 15 年前

    我需要能够从类的基类中的方法中检索类的自定义属性。现在,我正在通过基类中的受保护静态方法进行此操作,实现如下(该类可以应用同一属性的多个实例):

    //Defined in a 'Base' class
    protected static CustomAttribute GetCustomAttribute(int n) 
    {
            return new StackFrame(1, false) //get the previous frame in the stack
                                            //and thus the previous method.
                .GetMethod()
                .DeclaringType
                .GetCustomAttributes(typeof(CustomAttribute), false)
                .Select(o => (CustomAttribute)o).ToList()[n];
    }
    

    我从一个派生类称之为thusly:

    [CustomAttribute]
    [CustomAttribute]
    [CustomAttribute]
    class Derived: Base
    {
        static void Main(string[] args)
        {
    
            var attribute = GetCustomAttribute(2);
    
         }
    
    }
    

    理想情况下,我可以从Contractor调用它并缓存结果。

    谢谢。

    聚苯乙烯

    我认识到getCustomAttributes不能保证在词序方面返回它们。

    1 回复  |  直到 15 年前
        1
  •  8
  •   Daniel Schilling Aaron Palmer    15 年前

    如果使用实例方法而不是静态方法,则可以调用此.getType(),甚至可以从基类调用。

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
    class CustomAttribute : Attribute
    {}
    
    abstract class Base
    {
        protected Base()
        {
            this.Attributes = Attribute.GetCustomAttributes(this.GetType(), typeof(CustomAttribute))
                .Cast<CustomAttribute>()
                .ToArray();
        }
    
        protected CustomAttribute[] Attributes { get; private set; }
    }
    
    [Custom]
    [Custom]
    [Custom]
    class Derived : Base
    {
        static void Main()
        {
            var derived = new Derived();
            var attribute = derived.Attributes[2];
        }
    }
    

    它更简单,并且在您希望的构造函数中实现缓存。