2011-02-03 19 views
10

Bir sınıfın belirli üyelerinde kullandığım özel bir öznitelik yazdım:Özel özellikle dekore edilmiş mülkten değer elde edilsin mi?

public class Dummy 
{ 
    [MyAttribute] 
    public string Foo { get; set; } 

    [MyAttribute] 
    public int Bar { get; set; } 
} 

Özel öznitelikleri türden alıp belirli özniteliğimi bulabiliyorum. Ne yapılacağını anlayamadığım şey, atanan özelliklerin değerlerini elde etmektir. Bir Dummy örneğini alıp (bir nesne olarak) yöntemime aktardığımda .GetProperties() adresinden geri döndüğüm PropertyInfo nesnesini nasıl alabilirim ve .Foo ve .Bar'a atanan değerleri alabilir miyim?

DÜZENLEME:

Benim sorunum, GetValue'u nasıl düzgün bir şekilde arayacağımı anlayamıyorum.

void TestMethod (object o) 
{ 
    Type t = o.GetType(); 

    var props = t.GetProperties(); 
    foreach (var prop in props) 
    { 
     var propattr = prop.GetCustomAttributes(false); 

     object attr = (from row in propattr where row.GetType() == typeof(MyAttribute) select row).First(); 
     if (attr == null) 
      continue; 

     MyAttribute myattr = (MyAttribute)attr; 

     var value = prop.GetValue(prop, null); 
    } 
} 

Ancak, bunu yaptığımda, prop.GetValue çağrısı bana bir TargetException veriyor - Nesne hedef türüyle eşleşmiyor. Bu değeri almak için bu çağrıyı nasıl yapılandırabilirim?

cevap

11

Kişisel ihtiyaç GetValue nesneyi kendisi geçmesine değil, bir özellik nesnesi:

var value = prop.GetValue(o, null); 

Ve bir şey daha - .First(), ancak .FirstOrDefault() kullanmamalısınız, çünkü kodunuz bir an Bazı özellik herhangi bir nitelik içermiyorsa emilim:

object attr = (from row in propattr 
       where row.GetType() == typeof(MyAttribute) 
       select row) 
       .FirstOrDefault(); 
+0

FirstOrDefault'da Anlaşıldı - bu, sorunu göstermek için çoğunlukla tartışılan bir örnektir, ancak yardım için teşekkürler. Duh, öyle olduğuna inanamıyorum. – Joe

3

Sen .GetProperties() kullanarak PropertyInfo dizisi olsun ve her

Çağrı üzerine PropertyInfo.GetValue Yöntemi diyoruz bu şekilde:

var value = prop.GetValue(o, null); 
+0

Netleştirmek için; OP, bir özellik değeri elde etmek için Dummy sınıfının bir örneğine ihtiyaç duyacaktır. Bir Tür kendi başına yeterli değildir. – KeithS

+0

Sorumu güncelledim - sorunum tam olarak .GetValue ve nasıl çağırılacağı ile ilgili olarak çalışır. – Joe

+1

@Joe bkz. Güncelleştirme – Andrey

İlgili konular