Представьте на мгновение, что это возможно.Предположим, у меня может быть перегруженный делегат:
public delegate void OneDelegate(int i);
public delegate void OneDelegate(string s);
Теперь представьте, что я объявляю переменную этого типа, а затем назначаю ей функцию, например:
OneDelegate myDelegate = StringMethod;
где StringMethod
объявляется так:
public void StringMethod(string s) { Console.WriteLine(s); }
Теперь вы передаете myDelegate
другому коду, и этот код делает это:
myDelegate(47);
Что вы ожидаете в этом случае?Как может во время выполнения вызвать StringMethod()
с целочисленным аргументом?
Если вы действительно хотите, чтобы делегат мог принимать любой набор параметров на всех , тогда единственный вариант - это иметь один сparams object[]
массив:
public delegate void OneDelegate(params object[] parameters);
Но тогда вам нужно будет назначить ему функцию, которая может фактически обрабатывать любой массив объектов, например:
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.");
}
Как вы можете видеть, это становится грязно очень быстро.Поэтому я утверждаю, что если вам нужен такой делегат, вы, вероятно, допустили ошибку где-то в своем архитектурном проекте.Выявите этот недостаток и исправьте дизайн, прежде чем приступить к реализации, так как в противном случае поддержка вашего кода пострадает.