Если я правильно понимаю ваш вопрос, вы хотите создать лямбда-выражение вроде этого:
Func<MyAbstractClass<T>, Object> f = i => ((MyConcreteClass)i).SomeProperty;
За исключением того, что вы хотите указать, какое свойство является SomeProperty
в качестве параметра.Что ж, если вы хотите построить это выражение программно, вы должны сделать то же самое: иметь параметр выражения i
(типа MyAbstractClass<T>
), привести его к MyConcreteClass
и затем получить доступ к свойству SomeProperty
этого.
public Func<MyAbstractClass<T>, Object> GetPropertyGetter(PropertyInfo property)
{
var parameter = Expression.Parameter(typeof(MyAbstractClass<T>), "i");
var cast = Expression.TypeAs(parameter, property.DeclaringType);
var getterBody = Expression.Property(cast, property);
var exp = Expression.Lambda<Func<MyAbstractClass<T>, Object>>(
getterBody, parameter);
return exp.Compile();
}
Сказав это, я абсолютно не знаю, зачем вам это делать, поэтому вам лучше быть уверенным, что это именно то, что вы хотите сделать, и что нет лучшего способа сделать то, чтоВы действительно хотите сделать.