动态调用具有相同签名的方法

时间:2011-02-25 00:40:09

标签: c# dynamic

假设我有一个这样的课程:

class SomeClass
{

public void ActionFunction()
{
}

public void Do1(int num) {...}

public void Do2(int num) {...}

etc.
}

ActionFunction中,我想读取字符串,然后调用任何Do(Do1Do2等)。由于所有功能都具有相同的签名,我认为这是代表们的工作。但是你不能将函数的字符串名称传递给委托,我试图避免使用巨大的开关来找出要调用的函数。

我意识到我可以使用反射,但由于性能原因,我试图避免这种情况。

3 个答案:

答案 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);