Дерево выражений для 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);
}
Другие вопросы по тегам