2008-12-11 4 views
13

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

ответ

17

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

Одним из вариантов было бы объявить все общие делегаты 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 page.

+8

«? Почему вы хотите создать тип делегата в рамках метода» - потому что единственное, что использует тип делегата, - это обратный вызов, определенный в методе, поэтому распространение материалов, которые являются концептуально локальными для метода вне метода, чувствует ... icky. – 2015-01-28 20:50:11

13

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

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

4

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

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)); 
} 
Смежные вопросы