Создание типа делегата внутри метода
Я хочу создать тип делегата в С# внутри метода с целью создания анонимных методов.
Пример:
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 и С# 2.0.
Ответы
Ответ 1
Почему вы хотите создать тип делегата в методе? Что неправильно с объявлением его вне метода? В принципе, вы не можете этого сделать - вы не можете объявить тип (любой тип) внутри метода.
Одним из вариантов было бы объявить все общие делегаты 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());
}
Объявления находятся на моей странице С#/.NET версии.
Ответ 2
Тип делегата должен быть определен вне функции. Фактический делегат может быть создан внутри метода так же, как и вы.
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>
в своем коде выше.
Ответ 3
Делегаты компилируются в классы (класс, который наследуется от System.MulticastDelegate). В С# вам запрещено объявлять класс внутри метода (см. Спецификацию языка С#). Таким образом, вы также не можете объявить делегата в методе.
Ответ 4
Как насчет этого:
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));
}