Дерево выражений для o?.Value
Я хотел бы сгенерировать это предложение, используя деревья выражений:
o?.Value
o
является экземпляром любого класса.
Есть ли способ?
1 ответ
Решение
Обычно, если вы хотите сделать, как построить дерево выражений для некоторого выражения, вы позволяете компилятору C# делать это и проверять результат.
Но в этом случае это не сработает, потому что "лямбда дерева выражений может не содержать нуль-распространяющий оператор". Но на самом деле вам не нужен нулевой распространяющий оператор, вам просто нужно что-то, что ведет себя как один.
Вы можете сделать это, создав выражение, которое выглядит следующим образом: o == null ? null : o.Value
, В коде:
public Expression CreateNullPropagationExpression(Expression o, string property)
{
Expression propertyAccess = Expression.Property(o, property);
var propertyType = propertyAccess.Type;
if (propertyType.IsValueType && Nullable.GetUnderlyingType(propertyType) == null)
propertyAccess = Expression.Convert(
propertyAccess, typeof(Nullable<>).MakeGenericType(propertyType));
var nullResult = Expression.Default(propertyAccess.Type);
var condition = Expression.Equal(o, Expression.Constant(null, o.Type));
return Expression.Condition(condition, nullResult, propertyAccess);
}