2010-03-22 11 views
41

Necesito poder leer el valor de mi atributo desde mi Método, ¿cómo puedo hacer eso?Lea el valor de un atributo de un método

[MyAttribute("Hello World")] 
public void MyMethod() 
{ 
    // Need to read the MyAttribute attribute and get its value 
} 
+0

También hay una versión genérica (¡no es necesario que lances!) De estos métodos implementados como extensiones en las versiones más nuevas de .net (creo que después de 4.0), por lo que los visitantes revisan las respuestas distintas de la aceptada – Mafii

Respuesta

53

es necesario llamar a la función GetCustomAttributes en un objeto MethodBase.
La forma más sencilla de obtener el objeto MethodBase es llamar al MethodBase.GetCurrentMethod. (Tenga en cuenta que se debe añadir [MethodImpl(MethodImplOptions.NoInlining)])

Por ejemplo:

MethodBase method = MethodBase.GetCurrentMethod(); 
MyAttribute attr = (MyAttribute)method.GetCustomAttributes(typeof(MyAttribute), true)[0] ; 
string value = attr.Value; //Assumes that MyAttribute has a property called Value 

También puede obtener el MethodBase manualmente, así: (Esto será más rápido)

MethodBase method = typeof(MyClass).GetMethod("MyMethod"); 
23
[MyAttribute("Hello World")] 
public int MyMethod() 
{ 
var myAttribute = GetType().GetMethod("MyMethod").GetCustomAttributes(true).OfType<MyAttribute>().FirstOrDefault(); 
} 
+25

Trae un significado completamente nuevo a la expresión "autoreflexión" ... – Oded

+0

Unos años después, casi las 3 a.m. y el comentario anterior absolutamente me hizo llorar de risa ... Genial. @Oded –

+0

Hahahahah @Oded that's brilliant mate –

13

Las respuestas disponibles son en su mayoría anticuado.

Ésta es la mejor práctica actual:

class MyClass 
{ 

    [MyAttribute("Hello World")] 
    public void MyMethod() 
    { 
    var method = typeof(MyClass).GetRuntimeMethod(nameof(MyClass.MyMethod), new Type[]{}); 
    var attribute = method.GetCustomAttribute<MyAttribute>(); 
    } 
} 

Esto no requiere la fundición y es bastante seguro de usar.

También puede usar .GetCustomAttributes<T> para obtener todos los atributos de un tipo.

+1

'nameof' es muy bueno. –

0

Si almacena el valor por defecto del atributo en una propiedad (Name en mi ejemplo) en la construcción, a continuación, se puede utilizar un método Atributo ayudante estática:

using System; 
using System.Linq; 

public class Helper 
{ 
    public static TValue GetMethodAttributeValue<TAttribute, TValue>(Action action, Func<TAttribute, TValue> valueSelector) where TAttribute : Attribute 
    { 
     var methodInfo = action.Method; 
     var attr = methodInfo.GetCustomAttributes(typeof(TAttribute), true).FirstOrDefault() as TAttribute; 
     return attr != null ? valueSelector(attr) : default(TValue); 
    } 
} 

Uso:

var name = Helper.GetMethodAttributeValue<MyAttribute, string>(MyMethod, x => x.Name); 

Mi La solución se basa en que el valor predeterminado se establece en la construcción del atributo, como este:

internal class MyAttribute : Attribute 
{ 
    public string Name { get; set; } 

    public MyAttribute(string name) 
    { 
     Name = name; 
    } 
} 
Cuestiones relacionadas