o?.Value的表达式树

时间:2016-09-21 10:12:35

标签: c# linq linq-expressions null-propagation-operator

我想使用表达式树生成这句话:

o?.Value

o是任何一个类的实例。

有什么办法吗?

1 个答案:

答案 0 :(得分:5)

通常,如果你想如何为某个表达式构造表达式树,你可以让C#编译器执行它并检查结果。

但在这种情况下,它不会起作用,因为"表达式树lambda可能不包含空传播运算符。"但是你实际上并不需要空传播算子,你只需要一些行为类似的东西。

您可以通过创建如下所示的表达式来完成此操作: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);
}