Параметр Action , в котором T3 может быть необязательным

У меня есть следующий код:

public static MyMethod()  
{ 
   ...Do something  
   ProtectedMethod(param1, param2);  
   ...Do something  
}  

protected static void ProtectedMethod(IEnumerable<string> param1, string param2, int param3 = 1)  
{  
   ... Do something  
}

Обратите внимание на необязательный параметр param3.

Теперь по ряду причин мне нужно извлечь код метода MyMethod в его собственный класс, но я не могу извлечь ProtectedMethod с его помощью из-за всех классов, унаследованных от этого, и мне нужно, чтобы изменения были небольшими и изолированными.Поэтому я решил, что у меня может быть делегат Action <> в новый класс с той же сигнатурой, что и ProtectedMethod.

Проблема в том, что если я объявляю делегат следующим образом:

protected readonly Action<IEnumerable<string>, string, int> m_ProtectedMethod;

Извлеченному коду он не нравится, потому что он говорит, что метод вызывается только с двумя параметрами.

И если я объявляю делегата так:

protected readonly Action<IEnumerable<string>, string> m_ProtectedMethod;

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

Пока что единственный способ Я решил решить эту проблему, создав перегруженную версию ProtectedMethod для устранения укажите необязательный параметр.

Это единственный вариант или есть другой способ сделать это, поскольку теперь предпочтительным вариантом является наличие необязательных параметров вместо перегруженных методов?

30
задан stackuser83 4 June 2016 в 01:57
поделиться

1 ответ

Необязательные параметры являются атрибутом метода или параметра делегата. Когда вы вызываете подпись (метод или делегат), у которой есть известный необязательный параметр во время компиляции, компилятор вставит значение необязательного параметра в место вызова.

Среда выполнения не знает о необязательных параметрах, поэтому вы не можете создать делегат, который вставляет необязательный параметр при его вызове.

Вместо этого вам необходимо объявить пользовательский тип делегата с необязательным параметром:

public delegate void MyDelegate(IEnumerable<string> param1, string param2, int param3 = 1);

При вызове этого делегата вы сможете опустить третий параметр, независимо от объявления метода ( s) он содержит.

30
ответ дан 28 November 2019 в 00:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: