2011-02-03 9 views
10

Pisałem niestandardowych atrybutów, które używam na niektórych członków klasy:Uzyskaj wartość z niestandardowej właściwości zdobionej przez atrybut?

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

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

jestem w stanie uzyskać atrybutów niestandardowych od rodzaju i znaleźć konkretny atrybut. Nie mogę wymyślić, jak to zrobić, aby uzyskać wartości przypisanych właściwości. Kiedy biorę instancję Dummy i przekazuję ją (jako obiekt) do mojej metody, jak mogę zabrać obiekt PropertyInfo, który otrzymam z powrotem od .GetProperties() i uzyskać wartości przypisane do .Foo i .Bar?

EDIT:

Moim problemem jest to, że nie mogę dowiedzieć się, jak prawidłowo zadzwonić getValue.

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

Jednak, kiedy to zrobić, wywołanie prop.GetValue daje mi TargetException - Obiekt nie pasuje typu docelowego. Jak zorganizować to połączenie, aby uzyskać tę wartość?

Odpowiedz

11

Twoje potrzeby przekazać sam obiekt do getValue, a nie przedmiot nieruchomości:

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

I jeszcze jedno - powinieneś używać nie .First(), ale .FirstOrDefault(), ponieważ twój kod wyrzuci exc eption, jeśli jakaś właściwość nie zawiera żadnych atrybutów:

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

Uzgodnione na FirstOrDefault - jest to głównie wymyślny przykład, aby zademonstrować problem, ale dzięki za pomoc. Duh, nie mogę uwierzyć, że to było to. – Joe

3

dostać tablicę PropertyInfo użyciu .GetProperties() i nazywają PropertyInfo.GetValue Metoda na każdej

nazwać to w ten sposób:

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

Aby wyjaśnić; PO będzie potrzebował instancji klasy Dummy, aby uzyskać z niej wartość właściwości. Typ sam w sobie nie wystarcza. – KeithS

+0

Mam zaktualizowane moje pytanie - mój problem jest dokładnie z .GetValue i jak go nazwać, więc to faktycznie działa. – Joe

+1

@Joe zobacz aktualizację – Andrey

Powiązane problemy