CreateDelegate派生类必须提供实现

时间:2013-09-26 19:38:00

标签: c# .net reflection delegates linq-expressions

当调用创建一个已编译的表达式时,我试图在生成的已编译委托上调用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));
}

1 个答案:

答案 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类型的委托。