Pytanie Jak dynamicznie uzyskać właściwość według nazwy z C # ExpandoObject?


mam ExpandoObject i chce zrobić getter, który zwróci właściwość po nazwie w czasie wykonywania, gdzie nazwa jest określona w łańcuchu zamiast na sztywno.

Na przykład I CAN może to zrobić:

account.features.isEmailEnabled;

a to się spełni. account jest ExpandoObject, i features jest również ExpandoObject. Więc mam ExpandoObject zawiera inne ExpandoObjects.

Więc to, co chcę móc zrobić, to:

account.features.GetProperty("isEmailEnabled");

i że ten powrót jest prawdziwy.

Powodem jest to, że mam wiele funkcji i chcę móc napisać jedną ogólną metodę gettera, w której mogę podać nazwę funkcji, której chcę, a metoda przekaże mi wartość konta account.features.whatever ( gdzie "cokolwiek" jest określone przez przekazanie ciągu znaków do ogólnej metody gettera). W przeciwnym razie będę musiał napisać 30-niektóre pobierające po jednym dla każdej funkcji.

Zrobiłem wiele badań i próbowałem zrobić coś takiego:

var prop = account.features.GetType();  
// this returns System.Dyanmic.ExpandoObject

śledzony przez

var value = prop.GetProperty(featureNameAsString); 

ale value zawsze wraca jako zero. Nie rozumiem, dlaczego. W oknie oglądania mogę to zrobić account.features.isEmailEnabled i pokazuje prawdę i mówi, że jest to boolean. Ale jeśli spróbuję uzyskać tę wartość za pomocą powyższego podejścia i przekazać isEmailEnabled jako featureNameAsString Właśnie otrzymuję zero.

Czy ktoś może mi powiedzieć, co robię źle i jakie jest dobre podejście, bez zbytniego skomplikowania?

Pracuję z ASP.NET w ramach 4.5.1.


30
2017-10-02 14:28


pochodzenie




Odpowiedzi:


ExpandoObject zapewnia dostęp zarówno przez dynamic i przez IDictionary<string,object> - możesz więc użyć słownika API:

var byName = (IDictionary<string,object>)account.features;
bool val = (bool)byName["isEmailEnabled"];

Lub jeśli nazwa jest ustalona, ​​po prostu:

bool val = ((dynamic)account).features.isEmailEnabled;

55
2017-10-02 14:31