Подтвердить что ты не робот

Как динамически получить свойство по имени из С# ExpandoObject?

У меня есть ExpandoObject и хочу создать getter для него, который вернет свойство по имени во время выполнения, где имя указано в строке вместо hardcoded.

Например, я МОГУ сделать это:

account.features.isEmailEnabled;

и это вернет true. account является ExpandoObject, а features также является ExpandoObject. Поэтому у меня есть ExpandoObject, который содержит другие ExpandoObjects.

Итак, что я хочу сделать, это:

account.features.GetProperty("isEmailEnabled");

и вернуть это значение true.

Причина в том, что у меня много функций, и я хочу иметь возможность написать один общий метод getter, где я могу передать имя функции, которую я хочу, и метод передаст мне значение для account.features. где бы то ни было (где "все" указано, передавая строку в общий метод getter). В противном случае мне придется писать 30-х точечных для каждой функции.

Я много исследовал и пытался сделать что-то вроде:

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

за которым следует

var value = prop.GetProperty(featureNameAsString); 

но value всегда возвращается как null. Я не понимаю, почему. В окне просмотра я могу сделать account.features.isEmailEnabled, и он показывает true и говорит, что он является логическим. Но если я попытаюсь получить это значение, используя вышеприведенный подход и передав isEmailEnabled в качестве featureNameAsString, я просто получаю null.

Может кто-нибудь, пожалуйста, скажите мне, что я могу делать неправильно, и какой хороший подход, не будучи слишком сложным?

Я работаю с ASP.NET в рамках 4.5.1.

4b9b3361

Ответ 1

ExpandoObject обеспечивает доступ как через dynamic, так и через IDictionary<string,object> - поэтому вы можете просто использовать словарь API:

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

Или, если имя фиксировано, просто:

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