Imagine por un momento esto fue posible. Supongo que podría haber un delegado sobrecargado:
public delegate void OneDelegate(int i);
public delegate void OneDelegate(string s);
Ahora imagino que declara una variable de este tipo y luego asignar una función a la misma, por ejemplo:
OneDelegate myDelegate = StringMethod;
donde StringMethod
se declara así:
public void StringMethod(string s) { Console.WriteLine(s); }
Ahora se pasa a myDelegate
algún otro código, y que el código hace esto:
myDelegate(47);
¿Qué espera que suceda en este caso? ¿Cómo puede el tiempo de ejecución llamar al StringMethod()
con un argumento entero?
Si realmente quiere un delegado que puede tomar cualquier conjunto de parámetros en absoluto, entonces la única opción es tener uno con un params object[]
matriz:
public delegate void OneDelegate(params object[] parameters);
Pero entonces usted tendrá que asignar a es una función que realmente puede manejar cualquier matriz de objetos, por ejemplo:
public void MyMethod(params object[] parameters)
{
if (parameters == null || parameters.Length == 0)
throw new ArgumentException("No parameters specified.");
if (parameters.Length > 1)
throw new ArgumentException("Too many parameters specified.");
if (parameters[0] is int)
IntMethod((int) parameters[0]);
else if (parameters[0] is string)
StringMethod((string) parameters[0]);
else
throw new ArgumentException("Unsupported parameter type.");
}
Como puede ver, esto se complica demasiado rápido. Por lo tanto, le presento que si necesita un delegado de este tipo, probablemente haya cometido un error en algún lugar de su diseño arquitectónico. Identifique este defecto y arregle el diseño antes de continuar con la implementación, ya que de lo contrario se verá afectado el mantenimiento de su código.
Lo más cerca que puede obtener es sobrecargar utilizando genéricos, exactamente como todas las sobrecargas Action <> y Func <>. (Donde los argumentos genéricos representan los tipos de parámetros y los tipos de retorno.) Por supuesto, una vez que llegas tan lejos, surge la pregunta de por qué no usar Action <> y Func <> en primer lugar. –
Quiero tener solo UN TIPO de esta función para que pueda decir "¡Oye, aquí tienes una función, llámala!". Y no puedo hacer eso con Action <> AND Func <>. –