当Value为null时,从ConstantExpression获取值类型

时间:2016-01-13 14:37:14

标签: c# reflection

如果ConstantExpression值为null,我如何确定它的类型?我之前使用以下代码检测到类型,但是当ConstantExpression值为null时,它会导致null异常。

static Type GetType(Expression expression)
{
    //causes exception when ((ConstantExpression)expression).Value is null
    if (expression is ConstantExpression)
        return ((ConstantExpression)expression).Value.GetType(); 

    //Check other types
}

想象一下我的表情创作与此类似: -

int? value = null;
ConstantExpression expression = Expression.Constant(value);

我想确定类型int?

1 个答案:

答案 0 :(得分:2)

expression.Type

但请注意,如果使用您在问题中显示的工厂方法创建ConstantExpression,则结果将为typeof(object),因为当工厂检查value时,它将会获得一个null对象,无法在其上调用GetType()。如果你要关心ConstantExpression的类型,即使是null,你需要使用传递类型参数的重载。这也意味着如果value不是null,则返回的类型为typeof(int),而不是typeof(int?)

Expression.Constant((int?)null).Type // == typeof(object)
Expression.Constant((int?)null, typeof(int?)).Type // == typeof(int?)
Expression.Constant(null, typeof(int?)).Type // == typeof(int?)
Expression.Constant((int?)3).Type // == typeof(int)
Expression.Constant((int?)3).Value.GetType() // == typeof(int)
Expression.Constant((int?)3, typeof(int?)).Type // == typeof(int?)
Expression.Constant(3, typeof(int?)).Type // == typeof(int?)

最后,但并非最不重要:

Expression.Constant(null, typeof(int)) // ArgumentException thrown, "Argument types do not match"