以下是示例代码测试:
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。
答案 0 :(得分:1)
好吧,我找到了一个优雅的解决方法。
首先,我们只创建一个基类,在我的例子中是:
public abstract class AsyncClientBase
{
protected readonly IAsyncRequestProcessor Processor;
protected AsyncClientBase(IAsyncRequestProcessor processor)
{
Processor = processor;
}
}
然后我们可以在表达式中使用字段(因为基类型是 已经建成)。
T
基类型方法中this
参数的类型T
(有一个隐式转换子 - > base,所以& #39; s ok),我们可以在生成的方法中使用字段。 Here是一个完整的代码(请参阅ServiceClient
,Helpers.XLambdaExpression
,Helper.EmitHelper
)。