当调用创建一个已编译的表达式时,我试图在生成的已编译委托上调用CreateDelegate,但是我正在使用NotSupportedException,其解释是:派生类必须提供一个实现。如何为编译的方法创建委托?
public delegate int AddOne(int input);
void Main()
{
var input = Expression.Parameter(typeof(int));
var add = Expression.Add(input,Expression.Constant(1));
var lambda = Expression.Lambda(typeof(AddOne),add,input);
var compiled = (AddOne)lambda.Compile();
compiled.Method.CreateDelegate(typeof(AddOne));
}
答案 0 :(得分:3)
您无需致电CreateDelegate
。将结果从lambda.Compile
投射到AddOne
就是您所需要的。
观察:
public delegate int AddOne(int input);
public int Test(AddOne f)
{
return f(1);
}
void Main()
{
var input = Expression.Parameter(typeof(int));
var add = Expression.Add(input,Expression.Constant(1));
var lambda = Expression.Lambda(typeof(AddOne),add,input);
var compiled = (AddOne)lambda.Compile();
Console.WriteLine(Test(compiled)); // 2
}
您可以成功调用Test
方法,该方法接受AddOne
类型的委托。