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

自作多情 提交于 2019-12-31 06:25:14

问题


I have a collection of strings. For example,

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

and I have respective methods for the string collection such as

void Method1, void Method2, void Method100

I select appropriate method like that:

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

The above code is really bored and I will have more string elements in the string collection {"150" ... "250"...}. How to make like that:

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

I do not want to use switch operator cause it gives rise to surplus of code.


回答1:


You can declare a dictionary with your keys and actions like

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

and invoke it as

actions["1"]();

PS: Presuming method void MethodOne(){ } is declared somewhere.




回答2:


Solution 1:

Use a delegate mapping. This is the faster solution.

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
}

Solution 2:

Use reflection. This is slower and is appropriate only if your methods have strict naming (eg. 1=MethodOne 150=Method150 will not work).

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

    // TODO: method not found
}



回答3:


You can use dynamic invocation

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


来源:https://stackoverflow.com/questions/32113875/how-to-call-an-appropriate-method-by-string-value-from-collection

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!