首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能简单过载时混合可选参数和参数

不能简单过载时混合可选参数和参数
EN

Stack Overflow用户
提问于 2014-07-24 14:31:50
回答 5查看 4.7K关注 0票数 17

这个问题类似,我希望将可选参数与params关键字混合使用,这当然会造成歧义。不幸的是,创建重载的答案不起作用,因为我想利用调用者信息属性,如下所示:

代码语言:javascript
运行
复制
    public void Info(string message, [CallerMemberName] string memberName = "", 
                     [CallerLineNumber] int lineNumber = 0, params object[] args)
    {
        _log.Info(BuildMessage(message, memberName, lineNumber), args);
    }

在没有可选参数的情况下创建重载会改变调用站点,从而阻止这些特定参数正常工作。

我找到了一个几乎可行的解决方案(尽管它很难看):

代码语言:javascript
运行
复制
    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,该重载占用较少的参数,这不是所希望的行为。

有什么方法可以做到这一点(也许使用一些我还没有学到的新属性?)或者,我们是否已经达到了自魔法编译器支持所能提供的极限?

EN

Stack Overflow用户

发布于 2014-07-24 14:54:51

途径1.

我你可以用StackFrame代替CallerLineNumber

代码语言:javascript
运行
复制
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);
}

有用的文件页:

  • StackFrame类
  • StackFrame.GetFileLineNumber法
  • StackFrame.GetMethod法

Way 2.

代码语言:javascript
运行
复制
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"));
}
票数 2
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24936586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档