Создание типа делегата внутри метода - PullRequest
18 голосов
/ 11 декабря 2008

Я хочу создать тип делегата в 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 ]

23 голосов
/ 11 декабря 2008

Почему вы хотите создать тип делегата внутри метода? Что плохого в том, чтобы объявить это вне метода? По сути, вы не можете этого сделать - вы не можете объявить тип (любой тип) внутри метода.

Одной из альтернатив будет объявить все универсальные делегаты Func / Action, которые присутствуют в .NET 3.5 - тогда вы можете просто сделать:

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 .

14 голосов
/ 11 декабря 2008

Делегат тип должен быть определен вне функции. Фактический делегат может быть создан внутри метода, как и вы.

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> в своем коде выше.

6 голосов
/ 26 апреля 2011

Делегаты скомпилированы в классы (класс, который наследуется от System.MulticastDelegate). В C # вам не разрешается объявлять класс внутри метода (см. Спецификацию языка C #). Таким образом, вы также не можете объявить делегата в методе.

0 голосов
/ 13 июня 2016

Что по этому поводу:

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));
}
...