我正在使用XML文件中提供的值动态创建表达式树(即我读取字符串)。从该文件中读取成员的值和类型。我正在尝试创建一个ConstantExpression
的整数:
XElement expression = GetMyCurrentMember();
//<member type="System.Int32">5</member>
return Expression.Constant(expression.Value, Type.GetType(expression.Attribute("type").Value, false, true));
在return
声明中,我收到错误Argument types do not match
,经过检查后,我正在传递一个string
并说它是int
。一个简单的演员会(可能)解决问题,但这意味着我正在失去整个系统的动态。而不是int
我可以拥有double
或char
甚至是自定义类型,而我真的不想为每种类型创建不同的调用或方法。有没有一种方法可以“强制”将输入值自动转换为请求的类型?
答案 0 :(得分:3)
您可以“转换”该值,但您需要决定转换失败时该怎么做:
string value = expression.Value;
Type type = Type.GetType(expression.Attribute("type").Value, false, true);
return Expression.Constant(Convert.ChangeType(value, type), type);
答案 1 :(得分:2)
我认为对于各种类型,一个简单的Convert.ChangeType
就可以解决问题:
XElement expression = GetMyCurrentMember();
//<member type="System.Int32">5</member>
var formatProv = CultureInfo.InvariantCulture;
var type = Type.GetType(expression.Attribute("type").Value, false, true);
var value = Convert.ChangeType(expression.Value, type, formatProv);
return Expression.Constant(value, type);
请注意,通过提供格式提供程序,您可以明确指定要在转换中使用的文化。