2009-09-20 2 views

ответ

16

Вы можете написать это, например

 Action<int> method = j => j++; 
     List<Action<int>> operations = new List<Action<int>>(); 

     operations.Add(method); 
     operations.Add(i => i++); 
+0

Если вам нужно что-то немного более гибкое, чем конкретный делегат, то попытайтесь иметь взгляд на делегате, определенный в ответе на этот вопрос: http://stackoverflow.com/questions/1184329/function-pointers -in-c –

0

Это, конечно, можно создать список конкретного типа делегата, как Действие или Func, или любые другие. Поскольку анонимные делегаты могут быть переданы любому типу делегата с совместимой сигнатурой, вы можете создать список делегатов, если у них есть совместимые подписи.

Я не думаю, что создание списка делегатов с несколькими типами подписей было бы очень полезно, так как наличие неуказанной подписи затруднило бы назвать делегата. Однако вы должны быть в состоянии сделать это с отражением. В этом случае вы можете просто использовать список объектов.

3

Проблема с вашим кодом заключается в том, что вы пытаетесь указать экземпляр как аргумент типа List.

Action<int> method - пример, тогда как Action<int> - это тип.

Как упоминается еще один плакат, вам просто нужно объявить тип списка как Action<int>, то есть только с параметром типа.

например.

var myNum = 5; 

var myops = new List<Action<int>>(); 
myops.Add(j => j++); 
myops.Add(j => j++); 

foreach(var method in myops) 
{ 
    Console.WriteLine(method(myNum)); 
} 

// Frowned upon, but fun syntax 

myops.Each(method => method(myNum)); 
+0

Почему он нахмурился? – recursive

+0

Некоторые люди думают, что подобные виды списков не должны использоваться с операциями, которые имеют побочные эффекты. Каждый метод, подобный этому, имеет побочные эффекты. – Joren

+0

@ Joren: Использование выражений LINQ (в том числе выражений понимания) только для побочных эффектов является проблематичным из-за их ленивой природы. Но анонимные методы и лямбда-выражения предназначены не только для LINQ, и нет никаких оснований ограничивать их чисто функциональностью в целом. Итак, IMO, использование лямбда с «List .Each()» - хороший подход. – Richard

Смежные вопросы