与这个问题类似,我希望将可选参数与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,该重载占用较少的参数,这不是所希望的行为。
有什么方法可以做到这一点(也许使用一些我还没有学到的新属性?)或者,我们是否已经达到了自魔法编译器支持所能提供的极限?
发布于 2014-07-24 14:54:51
途径1.
我你可以用StackFrame代替CallerLineNumber
public void Info(string message, params object[] args)
{
StackFrame callStack = new StackFrame(1, true);
string memberName = callStack.GetMethod().Name;
int lineNumber = callStack.GetFileLineNumber();
_log.Info(BuildMessage(message, memberName, lineNumber), args);
}有用的文件页:
Way 2.
public class InfoMessage
{
public string Message { get; private set; }
public string MemberName { get; private set; }
public int LineNumber { get; private set; }
public InfoMessage(string message,
[CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
Message = message;
MemberName = memberName;
LineNumber = lineNumber;
}
}
public void Info(InfoMessage infoMessage, params object[] args)
{
_log.Info(BuildMessage(infoMessage), args);
}
public string BuildMessage(InfoMessage infoMessage)
{
return BuildMessage(infoMessage.Message,
infoMessage.MemberName, infoMessage.LineNumber);
}
void Main()
{
Info(new InfoMessage("Hello"));
}https://stackoverflow.com/questions/24936586
复制相似问题