Создание дерева выражений для доступа к свойству Generic type

Мне нужно написать общий метод, который принимает экземпляр типа generic и имя свойства в строковом формате и возвращает дерево выражений

Мне нужно преобразовать простое лямбда-выражение

a => a.SomePropertyName

где a - это общий тип, который будет иметь свойство по имени SomePropertyName

Я знаю, что мы можем получить информацию о свойствах, используя следующий код отражения

System.Reflection.PropertyInfo propInfo = a.GetType().GetProperty("SomePropertyName");

Это может быть очень просто, но я не очень хорошо разбираюсь в деревьях выражений. Если есть аналогичный вопрос, пожалуйста, соедините его и закройте это

Ответ 1

Предполагая, что тип параметра и тип возврата неизвестны заранее, вам может потребоваться использовать object, но в принципе это справедливо:

var p = Expression.Parameter(typeof(object));
var expr = Expression.Lambda<Func<object, object>>(
    Expression.Convert(
        Expression.PropertyOrField(
             Expression.Convert(p, a.GetType()), propName), typeof(object)), p);

Если известны типы ввода и вывода, вы можете настроить параметры Func<,> и, возможно, удалить Expression.Convert. В крайнем конце вы можете получить лямбда, не зная подпись лямбда, через:

var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);

Ответ 2

Вы можете использовать это:

var p = Expression.Parameter(a.GetType(), "x");
var body = Expression.Property(p, "SomePropertyName");

Expression.Lambda(body, p);