2010-04-16 11 views

Respuesta

0

No creo que haya una forma de declarar funciones a través de Func ... a pesar de que sólo puede hacer:

public static bool MyMethod(int someid, params string[] types) {...} 
public static Func < int,params string[], bool > MyFunc = MyMethod; 
3

Respuesta corta, no se puede, si realmente quiere para preservar la funcionalidad params.

lo contrario, podría conformarse con:

Func<int, string[], bool> MyMethod = (id, types) => { ... } 

bool result = MyMethod(id, types); 
0

Creo desea una declaración Func como tal:

public static Func<int, string[], bool> MyMethod = ??? 
8

La palabra clave params se compila a un parámetro común con el ParamArray. No puede aplicar un atributo a un parámetro genérico, por lo que su pregunta es imposible.

Tenga en cuenta que todavía se podía utilizar un (params no) delegado regular:

Func<int, string[], bool> MyMethodDelegate = MyMethod; 

Con el fin de utilizar la palabra clave params con un delegado, tendrá que hacer su propio tipo de delegado :

public delegate bool MyMethodDelegate(int someid, params string[] types); 

incluso se podría hacer más genérica:

public delegate TResult ParamsFunc<T1, T2, TResult>(T1 arg1, params T2[] arg2); 
+0

OK, lo retiro, se puede hacer, buena solución :) – Benjol

0

¿Qué tal algunos métodos de ayuda como estos?

public static TResult InvokeWithParams<T, TResult> 
(this Func<T[], TResult> func, params T[] args) { 
    return func(args); 
} 

public static TResult InvokeWithParams<T1, T2, TResult> 
(this Func<T1, T2[], TResult> func, T1 arg1, params T2[] args2) { 
    return func(arg1, args2); 
} 

Obviamente, se podría aplicar esto para sobrecargas adicionales genéricas de Func (así como Action, para el caso).

Uso:

void TestInvokeWithParams() { 
    Func<string[], bool> f = WriteLines; 

    int result1 = f.InvokeWithParams("abc", "def", "ghi"); // returns 3 
    int result2 = f.InvokeWithParams(null); // returns 0 
} 

int WriteLines(params string[] lines) { 
    if (lines == null) 
     return 0; 

    foreach (string line in lines) 
     Console.WriteLine(line); 

    return lines.Length; 
} 
Cuestiones relacionadas