如果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?
答案 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"