Это будет зависеть от того, как будет потребляться m_ProtectedMethod
, но я нашел компромисс в моей собственной ситуации, когда я использую одну перегрузку больше, чем другую.
Просто определяет более простую (имеющую менее общие параметры) переменную Action <> , которая вызывает более сложный предоставленный метод переменной Action. Это может быть выполнено либо в (i) локальной области применения; или (ii) область объекта после присвоения свойства Action или конструкции объекта.
Поскольку не существует такой вещи, как перегрузка переменных / свойств, вам нужны два разных имени для результирующих двух связанных переменных Action.
EG i: Local Scope (вероятно, не самый подходящий для вашего сценария)
public MyMethod(Action<IEnumerable<string>, string, int> m_ProtectedMethod2)
{
Action<IEnumerable<string>, string> m_ProtectedMethod = (p1,p2) => {
m_ProtectedMethod2(p1,p2,1); //The value 1 is the default 3rd parameter
}
...Do something
m_ProtectedMethod(param1, param2);
...Do something
...If something
m_ProtectedMethod2(param1, param2, param3); //Calling the more complex form directly
...Do something
}
EG ii: Область действия объекта
private Action<IEnumerable<string>, string, int> m_ProtectedMethod2 = null;
private Action<IEnumerable<string>, string> m_ProtectedMethod = null;
protected Action<IEnumerable<string>, string, int> ProtectedMethod
{
get { return m_ProtectedMethod2; }
set {
m_ProtectedMethod2 = value;
m_ProtectedMethod = (p1,p2) => {
m_ProtectedMethod2(p1,p2,1); //The value 1 is the default 3rd parameter
}
}
}
public MyMethod()
{
...Do something
m_ProtectedMethod(param1, param2);
...Do something
...If something
m_ProtectedMethod2(param1, param2, param3); //Calling the more complex form directly
...Do something
}
Обратите внимание, что в обоих случаях я установил значение по умолчанию для переменной с более неловким именем, имеющей суффикс 2, чтобы при использовании более простая перегрузка имела более базовое имя переменной.