c# - 当不能简单地重载时混合可选参数和参数

标签 c# .net parameters optional-parameters callermembername

类似于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/

相关文章:

c# - 在 x64 上编译 OLEDB 依赖的可执行文件

c# - 如何在 Main 中启动公共(public)方法?

c# - 获取两个字符串的公共(public)前缀

c# - WCF 代理行为和参数

sql - T-SQL存储过程NULL输入值导致select语句失败

c# - 适用于 Windows 10 的 AppFabric 支持

c# - 如何强制隐藏字段的标签助手以小写形式呈现 bool 值

c# - 如何将外部参数包含到列表中

c# - 处理异步方法同步部分的异常

ruby-on-rails - 将保存的 Rails 参数从字符串中取回参数