2010-10-30 14 views
33

Cuando estoy tratando de usar params en un delegado de Acción ...¿Puedo usar params en Action o Func delegados?

private Action<string, params object[]> WriteToLogCallBack; 

Recibí este diseño error de tiempo:

Invalid token 'params' in class, struct, or interface member declaration

Cualquier ayuda!

+1

params no es un tipo, es decir, puede usar 'ref' en la definición de tipo? –

Respuesta

35

¿Qué tal esta solución?

private Action<string, object[]> writeToLogCallBack; 
public void WriteToLogCallBack(string s, params object[] args) 
{ 
    if(writeToLogCallBack!=null) 
    writeToLogCallBack(s,args); 
} 

O puede definir su propio tipo de delegado:

delegate void LogAction(string s, params object[] args); 
+0

¿Cómo se llama esto con una lambda? – toddmo

3

Usted puede utilizar params en la declaración real de un delegado, pero no en el tipo de uno. Los parámetros genéricos de una Acción son solo tipos, no los argumentos reales que se deben pasar al invocar al delegado. params no es un tipo, es una palabra clave.

9

Los parámetros de tipo variable no son posibles en C#. Por ejemplo, hay muchas declaraciones para Action<...>, Func<...> y Tuple<...>. Sin embargo, sería una característica interesante. C++ 0x has them.

+0

No estoy seguro de qué tan bien funcionaría con los genéricos (a diferencia de las plantillas). – CodesInChaos

0

Puede probar esto. Permite cualquier número de argumentos, y obtendrás un error de tiempo de compilación si pasas el número o tipo de argumentos incorrectos.

public delegate T ParamsAction<T>(params object[] oArgs); 

public static T LogAction<T>(string s, ParamsAction<T> oCallback) 
{ 
    Log(s); 
    T result = oCallback(); 
    return T; 
} 

Foo foo = LogAction<Foo>("Hello world.", aoArgs => GetFoo(1,"",'',1.1)); 
Cuestiones relacionadas