使用Expression类将字符串设置为int常量

时间:2014-02-04 14:20:40

标签: c# dynamic expression-trees

我正在使用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我可以拥有doublechar甚至是自定义类型,而我真的不想为每种类型创建不同的调用或方法。有没有一种方法可以“强制”将输入值自动转换为请求的类型?

2 个答案:

答案 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);

请注意,通过提供格式提供程序,您可以明确指定要在转换中使用的文化。