Если вы знаете тип «бара», вы можете сделать это (я повторно использую некоторые биты из ответа кодекайзена здесь):
static void Main(string[] args)
{
var bar = new Bar();
bar.Foo = "Hello, Zap";
Zap(() => bar.Foo);
Console.ReadLine();
}
private class Bar
{
public String Foo { get; set; }
}
public static void Zap<T>(Expression<Func<T>> source)
{
var body = source.Body as MemberExpression;
Bar test = Expression.Lambda<Func<Bar>>(body.Expression).Compile()();
Console.WriteLine(test.Foo);
}
В большинстве случаев вы можете найти выражение, представляющее ваш объект в дереве выражений, а затем скомпилировать и выполнить это выражение и получить объект (кстати, это не очень быстрая операция). Итак, бит, который вы пропустили, это метод Compile (). Вы можете найти немного больше информации здесь: Как: выполнить деревья выражений .
В этом коде я предполагаю, что вы всегда передаете выражение типа "() => object.Member". В реальном сценарии вам нужно будет либо проанализировать, что у вас есть нужное выражение (например, просто выдать исключение, если оно не является выражением MemberExpression). Или используйте ExpressionVisitor, что довольно сложно.
Я недавно ответил на очень похожий вопрос здесь:
Как подписаться на событие объекта внутри дерева выражений?