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