是否可以扫描作为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)"?
}
}
答案 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<>
类型中并使用其属性进行解析。