2010-03-22 14 views
41

Ich muss in der Lage sein, den Wert meines Attributs aus meiner Methode zu lesen, wie kann ich das tun?Lesen Sie den Wert eines Attributs einer Methode

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

Es gibt auch generische Version (Sie brauchen nicht Casting!) Dieser Methoden als Erweiterungen in neueren Versionen von .net implementiert (ich denke nach 4.0), so Besucher, überprüfen Sie die Antworten anders als die akzeptierte – Mafii

Antwort

53

Sie benötigen die GetCustomAttributes Funktion auf einem MethodBase Objekt aufzurufen.
Die einfachste Möglichkeit, das Objekt MethodBase zu erhalten, ist der Aufruf MethodBase.GetCurrentMethod. (Beachten Sie, dass Sie [MethodImpl(MethodImplOptions.NoInlining)] hinzufügen sollten)

Zum Beispiel:

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 

Sie auch die MethodBase manuell bekommen, wie folgt aus: (Dies wird schneller sein)

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

bringt eine ganz neue Bedeutung zum Ausdruck "Selbstreflexion" ... – Oded

+0

Ein paar Jahre später, fast 3 Uhr morgens und der obige Kommentar brachte mich vor Lachen zu Tränen ... Brilliant. @Oded –

+0

Hahahahah @Oded, das ist brillante Kumpel –

13

Die zur Verfügung stehenden Antworten sind meist veraltet.

Dies ist die aktuelle Best Practice:

class MyClass 
{ 

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

Dies erfordert kein Casting und ist ziemlich sicher zu bedienen.

Sie können auch .GetCustomAttributes<T> verwenden, um alle Attribute eines Typs abzurufen.

+1

'nameof' ist sehr nett. –

0

Wenn Sie den Standardattributwert in eine Eigenschaft speichern (Name in meinem Beispiel) auf dem Bau, dann können Sie eine statische Attribut Hilfsmethode verwenden:

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

Verbrauch:

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

Mein Lösung basiert darauf, dass der Standardwert für die Attributkonstruktion wie folgt festgelegt wird:

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

    public MyAttribute(string name) 
    { 
     Name = name; 
    } 
} 
Verwandte Themen