在方法内创建委托类型

时间:2008-12-11 13:22:46

标签: c# .net-2.0 delegates

我想在方法中的C#中创建一个委托类型,以便创建匿名方法。

例如:


public void MyMethod(){
   delegate int Sum(int a, int b);

   Sum mySumImplementation=delegate (int a, int b) {return a+b;}

   Console.WriteLine(mySumImplementation(1,1).ToString());
}

不幸的是,我不能在.NET 2.0和C#2.0中这样做。

4 个答案:

答案 0 :(得分:23)

为什么要在方法中创建委托类型?在方法之外声明它有什么问题?基本上,你不能这样做 - 你不能在方法中声明类型(任何类型)。

另一种方法是声明.NET 3.5中存在的所有Func / Action泛型委托 - 然后你可以这样做:

public void MyMethod(){
    Func<int, int, int> mySumImplementation = 
        delegate (int a, int b) { return a+b; };

    Console.WriteLine(mySumImplementation(1,1).ToString());
}

声明在我的C#/.NET Versions page

答案 1 :(得分:14)

必须在函数外部定义委托类型。可以在方法内部创建实际委托。

class MyClass {
  delegate int Sum(int a, int b);
  public void MyMethod(){

       Sum mySumImplementation=delegate (int a, int b) {return a+b;}

       Console.WriteLine(mySumImplementation(1,1).ToString());
  }

}

是有效的。 最好的解决方案可能是模拟.NET3.5,并在全局创建一些通用委托类型,可以在整个解决方案中使用,以避免不断重新声明委托类型的所有内容:

delegate R Func<R>();
delegate R Func<T, R>(T t);
delegate R Func<T0, T1, R>(T0 t0, T1 t1);
delegate R Func<T0, T1, T2, R>(T0 t0, T1 t1, T2 t2);

然后,您可以在上面的代码中使用Func<int, int, int>委托。

答案 2 :(得分:6)

将委托编译为类(继承自System.MulticastDelegate的类)。在C#中,不允许在方法内声明类(请参阅C#语言规范)。因此,您无法在方法中声明委托。

答案 3 :(得分:0)

这个怎么样:

static void Main(string[] args)
{
    Expression<Func<int, int, int>> exFunc = (a, b) => a + b;
    var lambda = exFunc as LambdaExpression;
    Delegate del = exFunc.Compile();
    Console.WriteLine(del.DynamicInvoke(2, 2));
}