2010-03-22 11 views
41

Özniteliğimin değerini Yöntemim içinden okuyabilmem gerekir, bunu nasıl yapabilirim?Bir yöntemin özniteliğinin değerini okuyun

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

Ayrıca .net (4.0 sonra düşünüyorum) daha yeni sürümlerinde uzantıları olarak uygulanan bu yöntemlerin genel bir sürümü (döküm gerekmez!), Böylece ziyaretçiler, kabul edilen bir – Mafii

cevap

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

dışında yeni bir anlam getiriyor ifade "kendini yansıma" ... – Oded

+0

Birkaç yıl, neredeyse 3 am ve yukarıdaki yorum kesinlikle beni kahkaha ile gözyaşları içine getirdi ... Parlak. @Oded –

+0

Hahahahah @Oded bu parlak arkadaşım –

13

mevcut cevaplar (Bu hızlı olacaktır): Bu gibi

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 

el ile de MethodBase alabilirsiniz: Örneğin

(eğer [MethodImpl(MethodImplOptions.NoInlining)] eklemek gerektiğini unutmayın) çoğunlukla modası geçmiş.

class MyClass 
{ 

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

Bu, hiçbir casting gerektirir ve kullanımı oldukça güvenlidir:

Bu akım en iyi uygulamadır.

Bir türün tüm özelliklerini almak için .GetCustomAttributes<T>'u da kullanabilirsiniz.

+1

'nameof' çok güzel. –

0

Eğer inşaat (bizim örneğimizde Name) bir mülkte varsayılan özellik değeri saklamak, o zaman statik Özellik yardımcı yöntemi kullanabilirsiniz:

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

Kullanımı:

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

Benim çözüm, varsayılan değerin, aşağıdaki gibi özellik yapısının üzerine kurulduğuna dayanır:

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

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