tresult ejemplo c# delegates action params-keyword

ejemplo - func string c#



¿Puedo usar params en Action o Func delegados? (5)

¿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);

Cuando intento usar params en un delegado de Acción ...

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

Recibí este error de tiempo de diseño:

"Params" de token inválidos en la declaración de miembro de clase, estructura o interfaz

¡Alguna ayuda!


He hecho una extensión menor al código anterior de Bryan, para mostrar cómo ajustar varias llamadas a métodos.
Estoy usando esto para envolver múltiples métodos que contienen llamadas a la base de datos, en una sola transacción.
Gracias Bryan :-)
(Puede ejecutar lo siguiente en LINQPad para probar)

//Wrapper code public delegate void MyAction(params object[] objArgs); public static void RunActions(params MyAction[] actnArgs) { Console.WriteLine("WrapperBefore: Begin transaction code/n"); actnArgs.ToList().ForEach( actn => actn() ); Console.WriteLine("/nWrapperAfter: Commit transaction code"); } //Methods being called public void Hash (string s, int i, int j) => Console.WriteLine(" Hash-method call: " + s + "###" + i.ToString() + j.ToString()); public void Slash (int i, string s) => Console.WriteLine(" Slash-method call: " + i.ToString()+ @"////" + s); //Actual calling code void Main() { RunActions( objArgs => Hash("One", 2, 1) ,objArgs => Slash(3, "four") ); } //Resulting output: // // WrapperBefore: Begin transaction code // // Hash-method call: One###21 // Slash-method call: 3////four // // WrapperAfter: Commit transaction code


Los parámetros de tipo variable no son posibles en C #.

Es por eso que hay muchas declaraciones para Action<...> , Func<...> y Tuple<...> , por ejemplo. Sin embargo, sería una característica interesante. C ++ 0x los tiene .


Podrías 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));


Puede usar 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.