我最近开始使用C#,我曾经想在C#中轻松完成这项工作。
例如,我有一个像:
这样的函数def my_func():
return "Do some awesome stuff"
和一本字典:
my_dic = {"do": my_func}
我制作了一个脚本,当用户输入“do”时,程序会根据字典调用my_func
。
我想知道如何将函数分配给C#字典中的字符串。
答案 0 :(得分:50)
基本上以同样的方式:
static void Main() {
var dict = new Dictionary<string, Action>();
// map "do" to MyFunc
dict.Add("do", MyFunc);
// run "do"
dict["do"]();
}
static void MyFunc() {
Console.WriteLine("Some stuff");
}
答案 1 :(得分:18)
您可以在此处利用集合初始化程序语法。
var my_dic = new Dictionary<string, Action>
{
{ "do", my_func }
};
对于更复杂的功能,您可以使用相应的Action
类型替换声明中的Function
。
答案 2 :(得分:5)
与您的示例最直接类似的C#代码片段是:
string my_func() {
return "Do some awesome stuff";
}
和
var my_dic = new Dictionary<string, Func<string>> {
{ "do", my_func },
};
正如其他海报所指出的那样,技巧是创建一个字符串,其泛型值类型是Action(返回void的方法)或Func&lt; T&gt;。 (这是一个返回T类型对象的方法。)
在任何一种情况下,您都可以使用以下方法执行该方法:
var result = my_dic["do"]();
答案 3 :(得分:2)
如果你真的想要Python的动态行为(即能够无缝地分配和调用具有不同签名的方法到&#34;字典&#34;),我会选择具体的ExpandoObject意味着能够让CLR支持动态语言,如Python(参见IronPython等)。
static void Main()
{
dynamic expando = new ExpandoObject();
expando.Do = new Func<string>(MyFunc);
expando.Do2 = new Func<string, string>(MyFunc2);
Console.WriteLine(expando.Do());
Console.WriteLine(expando.Do2("args"));
}
static string MyFunc()
{
return "Do some awesome stuff";
}
static string MyFunc2(string arg)
{
return "Do some awesome stuff with " + arg;
}
如果您愿意,您甚至可以将ExpandoObject视为字典:
static void Main(string[] args)
{
dynamic expando = new ExpandoObject();
var dict = (IDictionary<string, object>) expando;
dict["Do"] = new Func<string>(MyFunc);
dict["Do2"] = new Func<string, string>(MyFunc2);
Console.WriteLine(expando.Do());
Console.WriteLine(expando.Do2("args"));
}
static string MyFunc()
{
return "Do some awesome stuff";
}
static string MyFunc2(string arg)
{
return "Do some awesome stuff with " + arg;
}
**编辑**
完全披露:这个问题似乎与String- Function dictionary c# where functions have different arguments非常相似(如果不是愚蠢),我只是以同样的方式回答。