假设我有一个这样的课程:
class SomeClass
{
public void ActionFunction()
{
}
public void Do1(int num) {...}
public void Do2(int num) {...}
etc.
}
在ActionFunction
中,我想读取字符串,然后调用任何Do(Do1
,Do2
等)。由于所有功能都具有相同的签名,我认为这是代表们的工作。但是你不能将函数的字符串名称传递给委托,我试图避免使用巨大的开关来找出要调用的函数。
我意识到我可以使用反射,但由于性能原因,我试图避免这种情况。
答案 0 :(得分:2)
您始终可以在内部维护字典,并根据该字典进行调用。您甚至可以使用反射来加载字典值,因为这将是一次性的前期成本,并且调用会很快。
private Dictionary<string, Action<int>> doMethods = new Dictionary<string, Action<int>>();
public SomeClass()
{
Type t = typeof(SomeClass);
var methods = t.GetMethods().Where(m => m.Name.StartsWith("Do"));
foreach(var method in methods)
doMethods.Add(method.Name, (Action<int>)Delegate.CreateDelegate(typeof(Action<int>), this, method, true));
}
public void ActionFunction(string name, int num)
{
this.doMethods[name](num);
}
答案 1 :(得分:1)
我会创建一个<string, Func<int>>
字典,其中键是字符串,值是要调用的方法的委托。然后你会做dict["string"].Value.Invoke()
答案 2 :(得分:0)
如果您使用的是.net 4.0,则开源框架ImpromptuInterface可以使用dlr根据名称4x faster than reflection调用您的操作。
Impromptu.InvokeMemberAction(target, actionName, num);