Tengo una interfaz que define los métodos con los atributos. Estos atributos deben ser accedidas desde el método de llamada, pero el método que yo no tire de los atributos de la interfaz. Lo que me estoy perdiendo?

public class SomeClass: ISomeInterface
{
    MyAttribute GetAttribute()
    {
        StackTrace stackTrace = new StackTrace();
        StackFrame stackFrame = stackTrace.GetFrame(1);
        MethodBase methodBase = stackFrame.GetMethod();
        object[] attributes = methodBase.GetCustomAttributes(typeof(MyAttribute), true);
        if (attributes.Count() == 0)
            throw new Exception("could not find MyAttribute defined for " + methodBase.Name);
        return attributes[0] as MyAttribute;
    }

    void DoSomething()
    {
        MyAttribute ma = GetAttribute();
        string s = ma.SomeProperty;
    }
}
  • Una forma de comprobar, ha establecido el indicador correspondiente en su atributo, para permitir que se hereda no?
InformationsquelleAutor Thad | 2008-10-30

3 Comentarios

  1. 7

    La methodBase será el método en la clase, no la interfaz. Usted tendrá que buscar el mismo método en la interfaz. En C# esto es un poco más sencillo (ya que debe ser del mismo nombre), pero usted tendría que considerar cosas como la implementación explícita. Si usted tiene el código de VB va a ser más complicado, ya que VB método de «Foo» puede implementar un método de interfaz «Bar». Para ello, sería necesario investigar el mapa de interfaz:

    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Reflection;
    interface IFoo
    {
        void AAA(); //just to push Bar to index 1
        [Description("abc")]
        void Bar();
    }
    class Foo : IFoo
    {
        public void AAA() { } //just to satisfy interface
        static void Main()
        {
            IFoo foo = new Foo();
            foo.Bar();
        }
        void IFoo.Bar()
        {
            GetAttribute();
        }
    
        void GetAttribute()
        { //simplified just to obtain the [Description]
    
            StackTrace stackTrace = new StackTrace();
            StackFrame stackFrame = stackTrace.GetFrame(1);
            MethodBase classMethod = stackFrame.GetMethod();
            InterfaceMapping map = GetType().GetInterfaceMap(typeof(IFoo));
            int index = Array.IndexOf(map.TargetMethods, classMethod);
            MethodBase iMethod = map.InterfaceMethods[index];
            string desc = ((DescriptionAttribute)Attribute.GetCustomAttribute(iMethod, typeof(DescriptionAttribute))).Description;
        }
    }
    • Este parece que no trabajan para las Interfaces Genéricas. IFoo<T>
    • He encontrado una manera de manejar esto
    • Usted sólo me salvó cerca de 1/2 día de la espeleología en MSDN. Gracias.
  2. 2

    Marca del método de trabajo para la no-interfaces genéricas. Pero parece que la estoy tratando con algunos de los que han genéricos

    interface IFoo<T> {}
    class Foo<T>: IFoo<T>
    {
      T Bar()
    }

    Parece que el T se reemplaza con el real classType en el mapa.TargetMethods.

    • Puedes dar más información sobre lo que es el contexto? No puedo visualizar exactamente lo que usted está tratando de hacer…
  3. 0

    Mientras voy a confesar que nunca he intentado asociar atributos a las Interfaces, pero sería algo como lo siguiente trabajo para usted?

    public abstract class SomeBaseClass: ISomeInterface
    {
         [MyAttribute]
         abstract void MyTestMethod();
    
    
    }
    
    public SomeClass : SomeBaseClass{
    
      MyAttribute GetAttribute(){
          Type t = GetType();
          object[] attibutes = t.GetCustomAttributes(typeof(MyAttribute), false);
    
          if (attributes.Count() == 0)
                throw new Exception("could not find MyAttribute defined for " + methodBase.Name);
            return attributes[0] as MyAttribute;
      }
    
    
      ....
    }

Dejar respuesta

Please enter your comment!
Please enter your name here