我有一组字符串。例如,
string[] coll={"1", "2", "3" ..."100"..."150"...}
我有各自的字符串集方法,如
void Method1, void Method2, void Method100
我选择适当的方法:
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运算符,因为它会导致代码过剩。
答案 0 :(得分:2)
解决方案1:
使用委托映射。这是更快的解决方案。
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
}
解决方案2:
使用反射。这个速度较慢,仅当您的方法具有严格的命名时才适用(例如,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
}
答案 1 :(得分:1)
您可以使用动态调用
var methodName = "Method" + selector;
var method = this.GetType().GetMethod(methodName);
if (method == null)
{
// show error
}
else
method.Invoke(this, null);
答案 2 :(得分:1)
您可以使用键和
等操作声明字典Dictionary<string, Action> actions = new Dictionary<string, Action>()
{
{ "1", MethodOne },
{ "2", ()=>Console.WriteLine("test") },
............
};
并将其作为
调用actions["1"]();
PS:在某处声明推定方法void MethodOne(){ }
。