类似于this question ,我想将可选参数与 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
,这不是所希望的行为。
有什么方法可以做到这一点(也许使用一些我还没有学过的新属性?)还是我们只是达到了自动编译器支持所能提供的极限?
最佳答案
我的首选方式: 只有两个字符开销 - 虽然丑陋的语言“hack”;
public delegate void WriteDelegate(string message, params object[] args);
public static WriteDelegate Info(
[CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
return new WriteDelegate ((message,args)=>
{
_log.Info(BuildMessage(message, memberName , lineNumber ), args);
});
}
用法(提供您自己的 BuildMessage
Info()("hello world {0} {1} {2}",1,2,3);
备选
我的同事提出这项工作的方式是这样的:
public static class DebugHelper
public static Tuple<string,int> GetCallerInfo(
[CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
return Tuple.Create(memberName,lineNumber);
}
}
信息方法:
public void Info(Tuple<string,int> info, string message, params object[] args)
{
_log.Info(BuildMessage(message, info.Item1, info.Item2), args);
}
用法:
instance.Info(DebugHelper.GetCallerInfo(),"This is some test {0} {1} {2}",1,2,3);
关于c# - 当不能简单地重载时混合可选参数和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24936586/