【问题标题】:Using [CallerMemberName] Attribute with Func delegate将 [CallerMemberName] 属性与 Func 委托一起使用
【发布时间】:2020-08-03 12:41:43
【问题描述】:

我有 GUI 和命令行应用程序都使用的通用类

这个类被传递了一个 ReportError 函数引用,它在 GUI 和 CommandLine 上的作用不同。

在图形用户界面中:

 public int GUIReportError(String ToLog)
    {
        MessageBox.Show(ToLog);
        return 0;
    }

在普通类成员中:

readonly Func<string, int> ReportError;

在通用类构造函数中:

public CommonClass(Func<string, int> ReportErrorFunc)
{
   ReportError=ReportErrorFunc;
}

到目前为止,一切都很简单,但我会将 [CallerMemberName] 属性集成到我的日志函数中

public int GUIReportError(String ToLog, [CallerMemberName] string CallingFunction="")
        {
            MessageBox.Show(ToLog, CallingFunction);
            return 0;
        }

所以我也更新了 Func 定义:

 readonly Func<string,  string?, int> ReportError;

注意 ?告诉它是可选参数

但是当我调用这个 ReportError 函数时,我得到一个编译器错误,如下所示: CS7036:没有给出与 Func

所需的形参 'arg2' 相对应的参数

如果有人遇到过这种问题,我将不胜感激。

【问题讨论】:

  • 这能回答你的问题吗? Optional arguments in a generic Func<>
  • string? 并不表示该参数是可选的。 string?Nullable&lt;string&gt; 的缩写
  • string?string 相同,因为在 C# 中 strings 可以是 null。请注意,这不会使参数成为可选参数。
  • @Sinatr,感谢您的快速支持。您的第二条评论使我认为我必须将问题分成两部分:首先,我将在我的公共类中创建一个附加函数,该函数将通过 [CallerMemberName] 属性收集调用函数的名称,然后将其传递给日志函数。

标签: c# delegates callermembername


【解决方案1】:

是的,解决方案就在这里。

通用类声明了一个 ReportError 函数,其中包含 [CallerMemberName] 作为可选参数。

这个函数然后调用传递 2 个字符串的委托函数,而不必处理可选性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 2019-06-14
    • 2011-05-27
    • 2017-10-01
    • 1970-01-01
    • 2020-11-17
    • 2010-10-09
    • 2017-04-16
    相关资源
    最近更新 更多