【问题标题】:Dictionary of functions with returning value C#具有返回值的函数字典 C#
【发布时间】:2020-04-14 12:01:43
【问题描述】:

我在创建函数字典时遇到问题。我遇到的问题是如何从被调用的方法中返回值。

我尝试了类似的方法,但由于我收到有关从匿名函数返回值的错误,因此无法正常工作。我不知道如何正确调用 lambda,因为我看到的示例没有参数,而我有输入参数和返回值。

private static Dictionary<string, Action<String, String>> dictionary= new Dictionary<string, Action<String, String>>()
{
      {"key",
          (arg1, arg2) => {
              Class instance= new Class();
              return instance.MyFunction(arg1, arg2);)
      }
}

我想把它称为

 dictionary["key"]("abc", "123");

我知道将 MyFunction 设为静态会更简单,但 Class 正在实现一个接口,我正在使用 C# 7.3

【问题讨论】:

  • 你不能从void 方法返回并且还有一个额外的括号。 MyFunction的签名是什么?
  • 是的,我知道这一点。我在问如何创建具有返回类型的函数的字典
  • 你应该使用Func&lt;string, string,string&gt;

标签: c# dictionary lambda


【解决方案1】:

您需要使用Func,而不是Action,因为Action 不能返回值。 Func 的最后一个 Type 参数是返回类型。

    private static Dictionary<string, Func<String, String, String>> dictionary =
        new Dictionary<string, Func<String, String, String>>()
        {
            {
                "key",
                (arg1, arg2) =>
                {
                    Class instance = new Class();
                    return instance.MyFunction(arg1, arg2);
                }
            }
        };

更多信息在这里:https://docs.microsoft.com/en-us/dotnet/api/system.func-2?view=netcore-3.1

【讨论】:

    【解决方案2】:

    您应该使用Func 委托而不是Action,因为它会返回由最后一个类型参数指定的类型的值(与Action 不同)。假设MyFunction返回string,你可以像这样声明它

    private static Dictionary<string, Func<string, string,string>> dictionary =
        new Dictionary<string, Func<string, string, string>>
        {
            {
                "key",
                (arg1, arg2) =>
                {
                    var instance = new Class();
                    return instance.MyFunction(arg1, arg2);
                }
            }
        };
    

    然后像调用一样调用

    var result = dictionary["key"]("abc", "123");
    

    您还应该在代码中使用一个额外的括号来修复错字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2013-08-31
      相关资源
      最近更新 更多