Lambda to Expression tree conversion

前端 未结 3 450
死守一世寂寞
死守一世寂寞 2020-12-29 01:36

I will keep it really simple,

How do I get expression tree out of lambda??

or from query expression ?

相关标签:
3条回答
  • 2020-12-29 01:52

    Just to expand on Konrad's answer, and to correct Pierre, you can still generate an Expression from an IL-compiled lambda, though it's not terribly elegant. Augmenting Konrad's example:

    // Gives you a lambda:
    Func<int, int> f = x => x * 2;
    
    // Gives you an expression tree:
    Expression<Func<int, int>> g = x => f(x);
    
    0 讨论(0)
  • 2020-12-29 01:59

    Konrad's reply is exact. You need to assign the lambda expression to Expression<Func<...>> in order for the compiler to generate the expression tree. If you get a lambda as a Func<...>, Action<...> or other delegate type, all you have is a bunch of IL instructions.

    If you really need to be able to convert an IL-compiled lambda back into an expression tree, you'd have to decompile it (e.g. do what Lutz Roeder's Reflector tool does). I'd suggest having a look at the Cecil library, which provides advanced IL manipulation support and could save you quite some time.

    0 讨论(0)
  • 2020-12-29 02:11

    You must assign the lambda to a different type:

    // Gives you a delegate:
    Func<int, int> f = x => x * 2;
    // Gives you an expression tree:
    Expression<Func<int, int>> g = x => x * 2;
    

    The same goes for method arguments. However, once you've assigned such a lambda expression to a Func<> type, you can't get the expression tree back.

    0 讨论(0)
提交回复
热议问题