Как извлечь ссылку на объект из свойства доступа лямбда - PullRequest
2 голосов
/ 13 мая 2010

Вот дополнительный вопрос к Получить имя свойства в виде строки .

Учитывая метод Foo (проверка ошибок для краткости опущена):

// Example usage: Foo(() => SomeClass.SomeProperty)
// Example usage: Foo(() => someObject.SomeProperty)
void Foo(Expression<Func<T>> propertyLambda)
{
    var me = propertyLambda.Body as MemberExpression;
    var pi = me.Member as PropertyInfo;
    bool propertyIsStatic = pi.GetGetMethod().IsStatic;
    object owner = propertyIsStatic ? me.Member.DeclaringType : ???;
    ...
    // Execute property access
    object value = pi.GetValue(owner, null);
}

У меня работает случай статического свойства, но я не знаю, как получить ссылку на someObject в случае свойства экземпляра.

Заранее спасибо.

1 Ответ

1 голос
/ 13 мая 2010

MemberExpression имеет свойство с именем Expression, которое является объектом, к которому происходит доступ к элементу.

Вы можете получить объект, скомпилировав функцию, которая его возвращает:

var getSomeObject = Expression.Lambda<Func<object>>(me.Expression).Compile();

var someObject = getSomeObject();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...