Создание дерева выражений для доступа к свойству 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);