【问题标题】:Set string as int constant using Expression class使用 Expression 类将字符串设置为 int 常量
【发布时间】:2014-02-04 14:20:40
【问题描述】:

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

【问题讨论】:

  • 如果您“拥有” XML 格式,您可能会考虑使用 XAML 而不是纯 XML。这样您就可以自动获得强类型值。
  • @MikeStrobel 不幸的是,这不是一个选择。表达式将进入旧文件。

标签: c# dynamic expression-trees


【解决方案1】:

您可以“转换”该值,但您需要决定如果转换失败该怎么办:

string value = expression.Value;
Type type = Type.GetType(expression.Attribute("type").Value, false, true);

return Expression.Constant(Convert.ChangeType(value, type), type);

【讨论】:

    【解决方案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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2015-10-11
      相关资源
      最近更新 更多