C# 可以在字典中存储函数吗?

C# 可以在字典中存储函数吗?,c#,dictionary,C#,Dictionary,我的C#app中有一条消息,它是一个序列化为JSON的对象,当我反序列化它时,我有一个“Name”string和一个“Payload”string[],我希望能够使用“Payload”在函数字典中查找“Name”数组作为其参数,然后将输出返回给发送消息的客户端,这在C#中是否可行 我找到了一个堆栈溢出的答案,其中第二部分似乎是合理的,但我不知道我引用的是什么状态,听起来你可能想要这样的东西: Dictionary<string, Func<string[], int>>

我的C#app中有一条消息,它是一个序列化为JSON的对象,当我反序列化它时,我有一个“Name”
string
和一个“Payload”
string[]
,我希望能够使用“Payload”在函数字典中查找“Name”数组作为其参数,然后将输出返回给发送消息的客户端,这在C#中是否可行

我找到了一个堆栈溢出的答案,其中第二部分似乎是合理的,但我不知道我引用的是什么
状态

,听起来你可能想要这样的东西:

Dictionary<string, Func<string[], int>> functions = ...;
Dictionary<string, Func<string[], int>> functions = 
    new Dictionary<string, Func<string[], int>>
{
    { "Foo", CountParameters },
    { "Bar", SomeOtherMethodName }
};

...

private static int CountParameters(string[] parameters)
{
    return parameters.Length;
}

// etc
或验证名称:

Func<string[], int> function;
if (functions.TryGetValue(name, out function))
{
    int result = function(parameters);
    ...
}
else
{
    // No function with that name
}

类似于此:

public class Methods
{
    public readonly Dictionary<string, Func<string[], object>> MethodsDict = new Dictionary<string, Func<string[], object>>();

    public Methods()
    {
        MethodsDict.Add("Method1", Method1);
        MethodsDict.Add("Method2", Method2);
    }

    public string Execute(string methodName, string[] strs)
    {
        Func<string[], object> method;

        if (!MethodsDict.TryGetValue(methodName, out method))
        {
            // Not found;
            throw new Exception();
        }

        object result = method(strs);

        // Here you should serialize result with your JSON serializer
        string json = result.ToString();

        return json;
    }

    public object Method1(string[] strs)
    {
        return strs.Length;
    }

    public object Method2(string[] strs)
    {
        return string.Concat(strs);
    }
}
公共类方法
{
公共只读词典方法dict=new Dictionary();
公共方法()
{
方法DICT.Add(“方法1”,方法1);
方法DICT.Add(“方法2”,方法2);
}
公共字符串执行(字符串方法名,字符串[]strs)
{
Func方法;
if(!MethodsDict.TryGetValue(methodName,out方法))
{
//未找到;
抛出新异常();
}
目标结果=方法(strs);
//在这里,您应该使用JSON序列化程序序列化结果
字符串json=result.ToString();
返回json;
}
公共对象方法1(字符串[]strs)
{
返回标准长度;
}
公共对象方法2(字符串[]strs)
{
返回字符串.Concat(strs);
}
}
请注意,如果这些方法不需要从其他地方访问数据,则可以将其全部设置为静态

我为代理选择的返回类型是
object
。通过这种方式,
Execute
方法可以将其自由序列化为Json。

var functions = new Dictionary<string, Func<string[], string[]>>();
functions.Add("head", x => x.Take(1).ToArray());
functions.Add("tail", x => x.Skip(1).ToArray());
var result = functions["tail"](new [] {"a", "b", "c"});
var functions=newdictionary();
Add(“head”,x=>x.Take(1.ToArray());
Add(“tail”,x=>x.Skip(1.ToArray());
var result=函数[“tail”](新的[]{“a”、“b”、“c”});

您可以创建一个字典,将
字符串作为键,将
操作作为值,并将其用于示例:

var functions = new Dictionary<string, Action<string[]>>();

functions.Add("compute", (p) => { /* use p to compute something*/ });
functions.Add("load", (p) => { /* use p to compute something*/ });
functions.Add("process", (p) => { /* use p to process something*/ });

我的解决方案,带有输入参数和一个int作为调用键:

  private static Dictionary<int, Action> MethodDictionary(string param1, string param2, int param3) => new Dictionary<int, Action>
    {
            {1 , () =>   Method1(param1, param2, param3) },
            {2 , () =>   Method2(param1, param2, param3) },
            {3 , () =>   Method3(param1, param2, param3) },
            {4 , () =>   Method4(param1, param2, param3) },
            {5 , () =>   Method5(param1, param2, param3) }
    };
 var methodDictionary = MethodDictionary("param1", "param2", 1);
 methodDictionary[2].Invoke();
这将执行方法2。


希望有帮助

是否可以使用这些方法返回值?
  private static Dictionary<int, Action> MethodDictionary(string param1, string param2, int param3) => new Dictionary<int, Action>
    {
            {1 , () =>   Method1(param1, param2, param3) },
            {2 , () =>   Method2(param1, param2, param3) },
            {3 , () =>   Method3(param1, param2, param3) },
            {4 , () =>   Method4(param1, param2, param3) },
            {5 , () =>   Method5(param1, param2, param3) }
    };
 var methodDictionary = MethodDictionary("param1", "param2", 1);
 methodDictionary[2].Invoke();