Извлечь общее значение, используя отражение - PullRequest
2 голосов
/ 18 июля 2011

У меня есть следующий интерфейс в моем проекте.

public interface Setting<T>
{
    T Value { get; set; }
}

Используя отражение, я хотел бы изучить свойства, которые реализуют этот интерфейс и извлечь значение.

Пока я написал это, который успешно создает список свойств, которые реализуют параметр.

var properties = from p in obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
                 where p.PropertyType.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IAplSetting<>))
                 select p;

Далее я хотел бы сделать следующее: (Пожалуйста, игнорируйте неопределенные переменные, вы можете предположить, что они действительно существуют в моем реальном коде.)

foreach (var property in properties)
{
    dictionary.Add(property.Name, property.GetValue(_theObject, null).Value);
}

Проблема в том, что GetValue возвращает объект.Чтобы получить доступ к Value, мне нужно иметь возможность привести к Setting<T>.Как мне получить Value и сохранить его, не зная точного типа T?

1 Ответ

2 голосов
/ 18 июля 2011

Вы можете продолжить этот подход с еще одним уровнем косвенности:

object settingsObject = property.GetValue(_theObject, null);
dictionary.Add(
    property.Name,
    settingsObject.GetType().GetProperty("Value")
                            .GetValue(settingsObject, null));

Если вы используете dynamic (re: ваш комментарий о ExpandoObject), это может быть очень многопроще:

dynamic settingsObject = property.GetValue(_theObject, null);
dictionary.Add(property.Name, settingsObject.Value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...