2009-09-20 7 views

Respuesta

16

Usted puede escribir esto, por ejemplo

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

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

Si necesita algo un poco más flexible que un delegado específico, a continuación, intenta echar un vistazo a la delegada se define en la respuesta a esta pregunta: ¿http://stackoverflow.com/questions/1184329/function-pointers -in-c –

0

Es ciertamente posible crear una lista de un tipo de delegado específico, como Acción o Func, o cualquier otro. Como los delegados anónimos se pueden convertir a cualquier tipo de delegado con una firma compatible, puede crear una lista de delegados, siempre que tengan firmas compatibles.

No creo que crear una lista de delegados con varios tipos de firmas fuera de mucha utilidad, ya que tener una firma no especificada dificultaría la tarea de llamar a un delegado. Sin embargo, deberías poder hacerlo con reflexión. En ese caso, puedes usar una lista de objetos.

3

El problema con su código es que está tratando de especificar una instancia como argumento de tipo para List.

Action<int> method es una instancia, mientras que Action<int> es un tipo.

Como menciona otro cartel, solo necesita declarar el tipo de lista como Action<int>, es decir, con solo el parámetro tipo.

p. Ej.

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

¿Por qué está mal visto? – recursive

+0

Algunas personas piensan que este tipo de listas de comprensión no debe usarse con operaciones que tienen efectos secundarios. An Cada método de este tipo tiene inherentemente efectos secundarios. – Joren

+0

@Joren: Usar expresiones LINQ (incluidas las expresiones de comprensión) solo para los efectos secundarios es problemático, debido a su naturaleza perezosa. Pero los métodos anónimos y las expresiones lambda no son solo para LINQ, y no hay ninguna razón para restringirlos a que sean puramente funcionales en general. Entonces, IMO, el uso de una lambda con 'List .Each()' es un buen enfoque. – Richard

Cuestiones relacionadas