Jeśli przechowywania obiekt jako typ object
, trzeba użyć refleksji. Dotyczy to dowolnego typu obiektu, anonimowego lub w inny sposób. Na obiekt O, można uzyskać jego typ:
Type t = o.GetType();
Następnie niż spojrzeć w górę właściwość:
PropertyInfo p = t.GetProperty("Foo");
Następnie z których można uzyskać wartość:
object v = p.GetValue(o, null);
Ta odpowiedź jest już dawno oczekiwana na aktualizację C# 4:
dynamic d = o;
object v = d.Foo;
A teraz kolejna alternatywa w C# 6:
object v = o?.GetType().GetProperty("Foo")?.GetValue(o, null);
Należy pamiętać, że za pomocą ?.
powodujemy otrzymany v
być null
w trzech różnych sytuacjach!
o
jest null
, więc nie ma żadnego obiektu w ogóle
o
jest nie- null
ale nie mają właściwość Foo
o
ma właściwość Foo
ale jego prawdziwa wartość bywa null
.
To nie jest odpowiednik wcześniejszych przykładów, ale może mieć sens, jeśli chcesz, aby wszystkie trzy przypadki były takie same.
Nigdy nie stosować przed dynamicznym dotychczas, miła zmiana do .NET 4.0 – Alan
woow, dobre dla C# 4 = D to działa dla mnie – ch2o
w rozwiązaniu C# otrzymasz wyjątek czasu wykonywania, jeśli właściwość nie istnieje ('object v = d.Foo'), natomiast' GetValue (o, null) 'będzie null, jeśli nie istnieje. – kobe