Expression.Constant
или ParameterExpression
ваши друзья;Примеры:
var obj = Expression.Constant(this);
var field = Expression.PropertyOrField(obj, "field");
var call = Expression.Call(field, field.Type.GetMethod("SomeOtherMethod"));
var lambda = Expression.Lambda<Func<int>>(call);
или:
var obj = Expression.Parameter(typeof(SomeType));
var field = Expression.PropertyOrField(obj, "field");
var call = Expression.Call(field, field.Type.GetMethod("SomeOtherMethod"));
var lambda = Expression.Lambda<Func<SomeType, int>>(call, obj);
(в последнем случае вы передадите this
в качестве параметра, но это означает, что вы можете сохранить лямбда и перевести-используйте его для различных целевых объектов экземпляра)
Другой вариант здесь может быть dynamic
, если ваши имена фиксированы:
dynamic obj = someDuckTypedObject;
int i = obj.field.SomeOtherMethod();