Back when I was working at db4o
, we had fun implementing a mechanism
somehow similar to LINQ, to have strongly typed queries expressed using code itself. The implementation uses Mono.Cecil
and Cecil.FlowAnalysis to decompile a delegate into an AST, that db4o's query optimizer can process.
Since .net 3.5, an API, System.Linq.Expressions, can be used to get a representation of a C# lambda expression into an object graph. An expression tree. .net 4.0 will add support for statements to this API, but as far as I know, the language itself hasn't been updated to produce those new nodes.
Anyway, a few days ago, someone on Stack Overflow
, asked how to turn a delegate into a LINQ expression tree
. There's no builtin feature to do that, it's not a straightforward process. You basically have to decompile the compiled method. I guess it's a good thing that I'm working on a decompiler
, if I need to decompile something.
Tonight I wrote a short spike to verify the feasibility of my idea, and it turns out to be pretty simple. Sample:
static void Main ()
Func magic = i => i * 42;
Expression> expression =
Console.WriteLine (expression.ToString ());
// prints: i => i * 42
Console.WriteLine (expression.Compile ().Invoke (1));
// prints: 42
DelegateConverter is implemented as a simple visitor which walks over a Cecil.Decompiler AST, and generates, if possible, the according Linq Expression Tree. Pretty cool isn't it?
You can browse the code of the spike
. Keep in mind that it's nowhere to be complete, and that it's just a proof of concept. Still, I think it's a pretty cool usage of the Cecil.Decompiler library.