【问题标题】:In .NET how to dynamically evaluate a complex expression against an object?在 .NET 中,如何针对对象动态评估复杂表达式?
【发布时间】:2012-03-20 19:57:16
【问题描述】:

在 C# 中,假设我有以下对象:

var myObject = new
{
    Val = new[]
    {
        new { ArrVal = "three1"},
        new { ArrVal = "three2"}
    }
};

如何针对对象动态评估以下表达式? (表达式是一个字符串

"Val[1].ArrVal"

在这种情况下,我希望表达式返回“three2”。我想写一个带有以下签名的方法:

object GetValue(string expression, object objectToExtractValueFrom)

我可以通过反射来做到这一点,或者以某种方式使用动态关键字吗?

【问题讨论】:

    标签: .net reflection dynamic


    【解决方案1】:

    您不能使用反射或动态关键字来做到这一点。你可以做的是:

    1. 解析字符串以创建一个 lambda 表达式树 将针对您的参数进行编译和执行
    2. 使用 CodeDOM
    3. 使用一些动态语言,例如 IronRuby 或 IronPython

    【讨论】:

    • +1 尽管即使使用 python 和 ruby​​ 字符串评估也是一件坏事。
    • 在我看来,这取决于这个字符串的来源。它不应该来自用户,这是肯定的。毕竟,字符串评估是问题所在。感谢您的加分。
    • 对于用户来说,这将是一个严重的安全问题。否则它通常是一个糟糕的设计。
    • 我同意这一点。然而,有些情况确实需要某种形式的自定义脚本。
    • 谢谢。这实际上是将域对象属性映射到自动填充的 PDF 文件。我宁愿走更静态的路线,并拥有可以使用的预定义键(映射到指定属性)。
    【解决方案2】:
    1. 添加 Spring.Core NuGet 包
    2. 使用 ExpressionEvaluator 类(请参阅http://www.springframework.net/doc/reference/html/expressions.html

    例子:

    ExpressionEvaluator.GetValue("Test", "Length.ToString().Length");
    ExpressionEvaluator.GetValue(null, "DateTime.Now")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多