如何在C#中“扫描”lambda表达式?

时间:2010-01-04 00:48:16

标签: c# .net linq lambda

是否可以扫描作为lambda表达式提供的函数,以便在运行时找出函数的性质?

示例:

class Program
{
    static void Main(string[] args)
    {
        Examples example = new Examples(x => x ^ 2 + 2);
    }
}

public class Examples
{
    public Examples(Func<dynamic, dynamic> func)
    {
        // How can I scan "func" here to figure out that it is defined as "x => x ^ 2 + 2" instead of, say, as "x => Math.Exp(x)"?
    }
}

4 个答案:

答案 0 :(得分:4)

您需要使用expression trees,如下所示:

public Examples(Expression<Func<dynamic, dynamic>> func) {
    ...
}

有关详细信息,请参阅here

答案 1 :(得分:1)

您所使用的是表达式树,您可以将示例方法签名更改为....

public Examples(Expression<Func<dynamic, dynamic>> exp)
{
  // Visit the expression in here...
}

答案 2 :(得分:1)

您可以通过查看Parameters属性和Body属性来检查LambdaExpression的语法结构。 Body是一个Expression节点,表示函数体的抽象语法树的根。

或使用ExpressionVisitor,它遍历表达式树中的节点。示例代码:http://msdn.microsoft.com/en-us/library/bb882521.aspx

答案 3 :(得分:0)

看一下这个链接:

http://msdn.microsoft.com/en-us/library/bb397951.aspx

基本上,您将Func<>类型包装在Expression<>类型中并使用其属性进行解析。