【问题标题】:How to map strings to methods with a dictionary如何使用字典将字符串映射到方法
【发布时间】:2022-03-20 07:45:33
【问题描述】:

我有一些看起来像这样的代码:

switch(SomeString)
{
   case "Value1":
        MethodA();
        break;

   case "Value2":
        MethodB();
        break;
   ... 40 other cases
}

我如何使用<string, method> 的字典重写这段代码,例如,键是“Value1”,值是 MethodA(),我会写一些说 “执行名称是键 SomeString 的值的函数。 请注意,所有方法都没有参数,也没有任何返回。

【问题讨论】:

标签: c#


【解决方案1】:

你可以这样做:

var actions = new Dictionary<string, Action>()
{
    { "Value1", () => MethodA() },
    { "Value2", () => MethodB() },
};

你会这样调用:

actions["Value1"]();

现在你可以简化为:

var actions = new Dictionary<string, Action>()
{
    { "Value1", MethodA },
    { "Value2", MethodB },
};

但我建议使用第一个选项,因为它允许您这样做:

var hello = "Hello, World!";
var actions = new Dictionary<string, Action>()
{
    { "Value1", () => MethodA(42) },
    { "Value2", () => MethodB(hello) },
};

【讨论】:

  • 很好,只是在考虑委托和 lambda 表达式。
  • +1。旁注:如果遵循() =&gt; MethodB(hello) 的建议要非常小心——C# 捕获变量,而不是值——所以如果hello 被更改,对MethodB 的调用也会改变。
  • 好的,谢谢您的回答;它在概念上与我在 javascript stackoverflow.com/questions/17076429/… 中写的这个答案非常相似,只是不知道如何让它在 C# 中工作!谢谢!
【解决方案2】:

声明你的字典:

Dictionary&lt;string,Action&gt; methodMap = new Dictionary&lt;string,Action&gt;();;

添加条目:

methodMap["Value1"] = MethodA; ...

执行:

methodMap["Value1"] ();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多