如何通过集合中的字符串值调用适当的方法?

How to call an appropriate method by string value from collection?

我有一组字符串。例如,

string[] coll={"1", "2", "3" ..."100"..."150"...} 

我有各自的字符串集合方法,例如

void Method1, void Method2, void Method100

我select这样的适当方法:

string selector=string.Empty;
switch(selector)
 { case "1": 
            MethodOne();
            break;
    ........
    case "150":
            Method150();
            break;
  }

上面的代码真的很无聊,我会在字符串集合{"150" ... "250"...}中添加更多的字符串元素。 如何制作:

 string sel=col[55];
 if(sel!=null)
        // call here the respective         method(method55)

我不想使用 switch 运算符,因为它会导致代码过多。

可以使用动态调用

 var methodName = "Method" + selector;
 var method = this.GetType().GetMethod(methodName);
 if (method == null)
 {
    // show error
 }
 else
    method.Invoke(this, null);

解决方案一:

使用委托映射。这是更快的解决方案。

private static Dictionary<string, Action> mapping =
    new Dictionary<string, Action>
    {
        { "1", MethodOne },
        // ...
        { "150", Method150 }
    };

public void Invoker(string selector)
{
    Action method;
    if (mapping.TryGetValue(selector, out method)
    {
        method.Invoke();
        return;
    }

    // TODO: method not found
}

方案二:

使用反射。这比较慢,并且仅当您的方法具有严格的命名时才适用(例如 1=MethodOne 150=Method150 将不起作用)。

public void Invoker(string selector)
{
    MethodInfo method = this.GetType().GetMethod("Method" + selector);
    if (method != null)
    {
        method.Invoke(this, null);
        return;
    }

    // TODO: method not found
}

您可以使用您的键和操作声明一个字典,例如

Dictionary<string, Action> actions = new Dictionary<string, Action>()
{
    { "1", MethodOne },
    { "2", ()=>Console.WriteLine("test") },
    ............
};

并将其调用为

actions["1"]();

PS: 假定方法 void MethodOne(){ } 已在某处声明。