Это действительно возможно, см. DelegateDecompiler:
https://github.com/hazzik/DelegateDecompiler
ПРИМЕЧАНИЕ. Я не связан с этим проектом
Редактировать
Вот основной подход, который используется в проекте:
- Получить MethodInfo для метода, который вы хотите преобразовать
- Использовать methodInfo.GetMethodBody для полученияобъект MethodBody.Он содержит, помимо прочего, MSIL и информацию об аргументах и локальных параметрах
- Просмотрите инструкции, изучите коды операций и соберите соответствующие выражения
- Свяжите все это вместе и верните оптимизированное выражение
Вот фрагмент кода проекта, который декомпилирует тело метода:
public class MethodBodyDecompiler
{
readonly IList<Address> args;
readonly VariableInfo[] locals;
readonly MethodInfo method;
public MethodBodyDecompiler(MethodInfo method)
{
this.method = method;
var parameters = method.GetParameters();
if (method.IsStatic)
args = parameters
.Select(p => (Address) Expression.Parameter(p.ParameterType, p.Name))
.ToList();
else
args = new[] {(Address) Expression.Parameter(method.DeclaringType, "this")}
.Union(parameters.Select(p => (Address) Expression.Parameter(p.ParameterType, p.Name)))
.ToList();
var body = method.GetMethodBody();
var addresses = new VariableInfo[body.LocalVariables.Count];
for (int i = 0; i < addresses.Length; i++)
{
addresses[i] = new VariableInfo(body.LocalVariables[i].LocalType);
}
locals = addresses.ToArray();
}
public LambdaExpression Decompile()
{
var instructions = method.GetInstructions();
var ex = Processor.Process(locals, args, instructions.First(), method.ReturnType);
return Expression.Lambda(new OptimizeExpressionVisitor().Visit(ex), args.Select(x => (ParameterExpression) x.Expression));
}
}