【问题标题】:Construct identity (e => e) at run time as expression tree在运行时将标识 (e => e) 构造为表达式树
【发布时间】:2018-06-08 12:49:59
【问题描述】:

我需要在运行时创建只返回它接收到的参数的身份表达式树。

在编译时我可以使用 lambda e => e 作为表达式树,但我需要在运行时进行转换。我正在寻找类似于在 MSDN Expression Trees 文章中构造 num => num < 5 的表达式树的代码。

【问题讨论】:

    标签: c# asp.net linq expression-trees


    【解决方案1】:

    这样就可以了:

    var param = Expression.Parameter(typeof(int), "e");
    var body = param;
    var lambda = Expression.Lambda<Func<int, int>>(body, param);
    

    lambda.ToString()的输出:

    e => e
    

    请注意,您需要给 e 一个类型(在本例中为 int)。


    预编辑说明:

    你写的(e =&gt; e)实际上已经是一个表达式树(如果定义为Expression&lt;T&gt;,就是这样)。但是,您可能希望使用工厂方法来构建树。

    【讨论】:

      【解决方案2】:

      e =&gt; e。就是这样。

      当然,它需要输入,例如Expression&lt;Func&lt;int, int&gt;&gt; intTree = e =&gt; e; 用于整数,Expression&lt;Func&lt;string, string&gt;&gt; stringTree = e =&gt; e; 用于字符串等等。

      现在你已经从 lambda 中得到了树,你可以检查它或者做任何你想要的树:

      Console.WriteLine(intTree.Parameters[0].Name); // "e"
      Console.WriteLine(intTree.CanReduce); // false
      Func<int, int> intIdentityFunction = intTree.Compile();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-12
        • 2015-01-27
        • 2018-04-16
        • 1970-01-01
        • 2015-09-07
        • 2015-08-26
        • 1970-01-01
        • 2011-11-02
        相关资源
        最近更新 更多