Подобно этому вопросу, я хочу смешивать необязательные параметры с ключевым словом 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
в перегрузке, которая принимает меньше аргументов, что не является желаемым поведением.
Есть ли способ сделать это (возможно, используя некоторые новые атрибуты, о которых я не узнал?) или мы просто достигли пределов того, что может дать нам поддержка автомагического компилятора?