C # делегирует методы с различными необязательными параметрами - PullRequest
3 голосов
/ 18 августа 2011

Я знаю, что могу объявить делегатов с постоянными параметрами по умолчанию, такими как:

delegate void MyDelegate(int x, int y = 5);

, а затем вызвать его в любом месте, используя любой метод, соответствующий сигнатуре.

Хорошо, у меня есть множество методов, объявленных следующим образом:

public Something FirstMethod(float val = 10, int skip = 0){ ... return sth; }
public Something SecondMethod(float val = 20, int skip = 0){ ... return sth; }
public Something ThirdMethod(float val = 5, int skip = 0){ ... return sth; }

... этот список идет вверх, во всяком случае, у них у всех есть такая структура подписи. Дело в том, что все они имеют аргумент с плавающей точкой, который по умолчанию отличается от другого.

Затем я хочу создать делегата, который будет указывать на один из следующих методов:

delegate Something ProblematicDelegateType(<<WHAT WILL GO HERE>>);
ProblematicDelegateType myFunc;
if(someValue == someParameter){
    myFunc = FirstMethod;
}else if(...){
    myFunc = SecondMethod;
}else...
...
}

myFunc();
myFunc(skip:100);

Я хочу иметь возможность вызывать myFunc без параметров или с параметром skip. В этой части кода первый параметр val НЕ используется. (они используются в других местах).

Что пойдет в список аргументов делегата? Я хочу сохранить аргумент по умолчанию val этого метода, каким бы он ни был.

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

Если я вас правильно понимаю, ваш myFunc полностью пропустит параметр val, всегда используя значение по умолчанию для любого метода, который вы в конечном итоге вызываете, правильно?

Если это так, это должно быть выполненочто вы ищете:

delegate Something ProblematicDelegateType(int skip = 0);
ProblematicDelegateType myFunc;
if (someValue == someParameter) {
    myFunc = skip => FirstMethod(skip: skip);
} else if (...) {
    myFunc = skip => SecondMethod(skip: skip);
} else ...
    ...
}
1 голос
/ 18 августа 2011

Ваше требование, чтобы делегат имел необязательный параметр, который варьируется в зависимости от метода, который он вызывает, не может быть выполнено.Необязательные параметры реализуются путем переписывания сайта вызова метода при его компиляции.Если метод, на который указывает делегат, определяется во время выполнения, что он будет писать во время компиляции?Серия Эрика Липперта по необязательным аргументам очень поучительна.

Тем не менее, вы также можете изучить использование отражения для получения значения по умолчанию.Используйте MethodInfo.GetParameters (), чтобы получить информацию о параметре, и ParameterInfo.DefaultValue , чтобы получить значение по умолчанию.

1 голос
/ 18 августа 2011

Используйте лямбду, чтобы связать значение, которое вы хотите. Значения по умолчанию - это эффективные перегрузки, которые связывают желаемое значение с параметром функции. Поскольку у вас есть различные if, разделяющие функции, просто передайте делегат функции, которая принимает только целое число.

Другими словами,

delegate Something ProblematicDelegateType(int skip = 0)

//...

ProblematicDelegateType myDelegate;
if (someCondition)
  myDelegate = (_1) => FirstMethod(10, _1);
else if (someOtherCondition)
  myDelegate = (_1) => SecondMethod(20, _1);

и т. Д.

...