Словарь функций с возвращаемым значением C# - PullRequest
3 голосов
/ 14 апреля 2020

У меня проблемы с созданием словаря функций. Проблема, с которой я сталкиваюсь, заключается в том, как вернуть значение из вызываемого метода.

Я пробовал что-то подобное, но это не работает, так как я получаю сообщение об ошибке при возврате значения из анонимной функции. Я не знаю, как правильно вызывать лямбду, поскольку примеры, которые я видел, не имеют аргументов, хотя у меня есть и входные параметры, и возвращаемое значение.

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 stati c было бы проще, но Class реализует интерфейс, и я работаю над C# 7.3

Ответы [ 2 ]

3 голосов
/ 14 апреля 2020

Вам необходимо использовать Func, а не Action, поскольку Action не может вернуть значение. Последний аргумент типа Func является типом возвращаемого значения.

    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

1 голос
/ 14 апреля 2020

Вы должны использовать 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");

Вы также должны исправить опечатку с дополнительной скобкой в ​​своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...