Подобно этому вопросу , Я хочу смешать необязательные параметры с ключевым словом params, что, конечно, создает двусмысленность. К сожалению, ответ о создании перегрузок не работает, так как я хочу использовать атрибуты информации о вызывающем абоненте, например:
public void Info(string message, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0, params object[] args)
{
_log.Info(BuildMessage(message, memberName, lineNumber), args);
}
Создание перегрузки без дополнительных параметров приведет к изменению сайта вызова, что помешает правильной работе этих конкретных параметров.
Я нашел решение, которое почти работает (хотя и некрасиво):
public void Info(string message, object arg0, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
_log.Info(BuildMessage(message, memberName, lineNumber), arg0);
}
public void Info(string message, object arg0, object arg1, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
_log.Info(BuildMessage(message, memberName, lineNumber), arg0, arg1);
}
Проблема здесь в том, что если вы указываете строку для последнего аргумента, разрешение перегрузки предполагает, что вы намерены явно указать memberName
в перегрузке, которая принимает меньше аргументов, что не является желаемым поведением.
Есть ли способ добиться этого (возможно, используя некоторые новые атрибуты, о которых я не знал?), Или мы просто достигли пределов того, что может дать нам автоматическая магическая поддержка компилятора?
CallerInfo
, решение с этим атрибутом просто ужасно. - person nicodemus13   schedule 14.09.2014