如何通过集合中的字符串值调用适当的方法?
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(){ }
已在某处声明。
我有一组字符串。例如,
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(){ }
已在某处声明。