Expression.Lamda不使用动态生成的类

时间:2016-07-15 12:24:33

标签: c# .net reflection lambda expression-trees

以下是示例代码测试:

var assembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("asm"), AssemblyBuilderAccess.Run);
var builder = assembly.DefineDynamicModule("MainModule");
Type type = builder.DefineType("newType");
var parameter = Expression.Parameter(type);
Console.WriteLine(type);
var expr = Expression.Lambda(Expression.Constant(1), parameter);

这里我得到一个例外

  

不支持指定的方法

我该如何避免它?我没有这种类型的编译时,我想通过使用Expression而不是手动发送它来创建构造函数。它甚至可能吗?我是用实例方法做的,但是我没有使用this。现在我需要它,但是当它正在构建时,访问类型if ifb。

1 个答案:

答案 0 :(得分:1)

好吧,我找到了一个优雅的解决方法。

  • 首先,我们只创建一个基类,在我的例子中是:

    public abstract class AsyncClientBase
    {
        protected readonly IAsyncRequestProcessor Processor;
    
        protected AsyncClientBase(IAsyncRequestProcessor processor)
        {
            Processor = processor;
        }
    }
    
  • 然后我们可以在表达式中使用字段(因为基类型是 已经建成)。

  • 然后我们使用Emit创建pass-params构造函数 (here就是一个例子)
  • 最后,我们只更改T基类型方法中this参数的类型T(有一个隐式转换子 - > base,所以& #39; s ok),我们可以在生成的方法中使用字段。

Here是一个完整的代码(请参阅ServiceClientHelpers.XLambdaExpressionHelper.EmitHelper)。