Lee el valor de un atributo de un método

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

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

MethodBase llamar a la función GetCustomAttributes en un objeto MethodBase .
La forma más sencilla de obtener el objeto MethodBase es llamar a MethodBase.GetCurrentMethod . (Tenga en cuenta que debe agregar [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 MethodBase manualmente, así: (Esto será más rápido)

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

Las respuestas disponibles son en su mayoría obsoletas.

Esta 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(); } } 

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

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

Si almacena el valor de atributo predeterminado en una propiedad ( Name en mi ejemplo) en la construcción, puede utilizar un método de Ayuda de atributo estático:

 using System; using System.Linq; public class Helper { public static TValue GetMethodAttributeValue(Action action, Func 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(MyMethod, x => x.Name); 

Mi 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; } }