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

2023-12-20

如同这个问题 https://stackoverflow.com/questions/3948971/c-sharp-4-0-optional-parameters-and-params-do-not-work-together,我想将可选参数与 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);
}

usage:

  instance.Info(DebugHelper.GetCallerInfo(),"This is some test {0} {1} {2}",1,2,3);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当不能简单地重载时混合可选参数和参数 的相关文章

随机推荐

  • 不知道为什么 dcast() 这个数据集会导致变量丢失

    我有一个数据框 如下所示 id fromuserid touserid from country to country length 1 1 54525953 47195889 US US 2 2 2 54525953 54361607 U
  • 在日志文件中隐藏敏感/机密信息

    您将如何隐藏敏感信息以免进入日志文件 是的 您可以有意识地选择首先不记录敏感信息 但在一般情况下 您可能会盲目地记录失败时的错误消息或在调查问题等时跟踪消息 最终导致敏感信息登陆您的计算机 日志文件 例如 您可能尝试将包含客户信用卡号的订单
  • 如何忽略脚本内的 stdin 输入

    我有一个程序 myprogram 它在控制台上运行时等待输入键 当我们按下某个键后 它就会退出 我想在后台运行这个 myprogram 并忽略标准输入 我有一个示例脚本 示例 sh 脚本 myprogram exit 0 但当我跑步时 sh
  • 如何在 gdb 中中断 UBSan 报告并继续?

    GCC 和 Clang 的最新版本具有未定义行为清理程序 UBSan 它是一个编译标志 fsanitize undefined 添加运行时检测代码 出现错误时 会显示如下警告 packet ber c 1917 23 运行时错误 54645
  • 如何从日期/时间字段快速选择不同的日期,SQL Server

    我想知道是否有一个性能良好的查询来从 SQL Server 中带有日期时间字段的表中选择不同的日期 忽略时间 我的问题不是让服务器实际执行此操作 我已经看到这个问题 https stackoverflow com questions 887
  • ElasticSearch NEST 搜索

    当我尝试对 ElasticSearch 实例执行搜索时遇到意外错误 我正在关注这里的文档 http nest azurewebsites net nest quick start html http nest azurewebsites n
  • 如何在单击时展开文本区域

    我正在开发一个有文本区域的小项目 我需要帮助来使文本区域在鼠标单击时展开 就像 Twitter 和 Facebook 那样 文本区域首先应该看起来像一个文本字段 然后单击时应该展开 这可以在不使用 JavaScript jQuery 的情况
  • R中的时间序列

    我正在电子表格中跟踪我的体重 但我想通过使用 R 来改善体验 我试图在 R 中找到一些有关时间序列分析的信息 但没有成功 我这里的数据采用以下格式 date gt weight gt body fat percentage gt water
  • Angular 5 ngx-bootstrap 表单验证

    我正在读阿里 勒纳的书ng book在 Angular 5 上 我正在使用ngx bootstrap and Bootstrap 4 表单验证似乎并不像勒纳先生实现的那样工作 我不确定这是否是一个限制ngx bootstrap 有人知道吗
  • 显示数组内容的问题

    下面的代码将内容和图像保存到 varcontent i content and vacontent i images 然而 我在正确显示内容和图像的循环之外唯一得到的是 varcontent i content Print r 显示数组的所
  • ValueError:需要解压的值太多(预期为 2)

    在我正在使用的Python教程书中 我输入了一个示例同时分配 当我运行程序时 我得到了前面提到的 ValueError 但不明白为什么 这是代码 avg2 py A simple program to average two exam sc
  • 当应用程序未运行时,GCM 推送通知不会在某些设备中显示

    我在我的应用程序中实现了 GCM 推送通知 并且已成功完成 但在某些设备中 当应用程序关闭时 它不会显示通知 未显示通知的设备列表 Redmi 2 lenovo Gionee 谁能解释一下问题是什么以及我如何解决它 这是我的清单
  • 如何在 Android Management API 中为 Web 应用程序启用 kiosk 模式

    我们的一位客户希望通过网络应用程序启用单一信息亭模式 当我们应用此配置时 它不起作用 网络应用程序不会显示 并且设备无法使用 即使安装了 Chrome 应用程序 当信息亭模式被禁用时 网络应用程序完全可用 所以我猜 AMAPI 方面有问题
  • Numpy:将每一行除以一个向量元素

    假设我有一个 numpy 数组 data np array 1 1 1 2 2 2 3 3 3 我有一个相应的 向量 vector np array 1 2 3 我该如何操作data沿着每一行进行减法或除法 结果是 sub result 0
  • Android;强制 AppWidget 从 SD 卡工作?

    即使应用程序移至 SD 卡且 SD 卡未移动 是否有任何方法可以强制 AppWidget 工作 unmounted Docs http developer android com guide topics data install loca
  • 意外结果,Gnu C 中的三元运算符

    所以三元运算符的运算符优先级为C对我来说真的很奇怪 例证 include
  • 是否有黄屏死机的实现?

    在 ASP NET 中 当您处于DEBUG模式 如果出现故障 您会看到著名的黄屏死机 这表明有一个Server Error in
  • 分配时 Python 字典键错误 - 如何解决这个问题?

    我有一本这样创建的字典 myDict 然后我想在其中添加对应于另一个字典的键 在其中放置另一个值 myDict 2000 hello 50 所以当我经过myDict 2000 hello 某处 它会给50 为什么 Python 不直接创建这
  • 如何通过 API 获取 Google Sheets 中的单元格编辑日期?

    我已经自动更新了包含 1500 多行的 Google 表格 我需要在 A 列单元格更改时用日期填充新列 我试图从中获取数据谷歌云端硬盘修订 https developers google com drive api v3 reference
  • 当不能简单地重载时混合可选参数和参数

    如同这个问题 https stackoverflow com questions 3948971 c sharp 4 0 optional parameters and params do not work together 我想将可选参数