2011-02-25 83 views
1

可以说我有一个这样的类:具有相同签名的动态地调用方法

class SomeClass 
{ 

public void ActionFunction() 
{ 
} 

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

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

etc. 
} 

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

我意识到我可以使用反射这一点,但我试图避免这个由于性能的原因。

+0

我需要ActionFunction来接收命令的文件运行,命令为Do1,Do2等。序列和一组操作可以根据用户而改变。如果不写更多,很难进入更多细节,但这基本上是我想要做的。 – cmptrer 2011-02-25 00:48:56

回答

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

我会做一个<string, Func<int>>字典,其中的关键是字符串和值是要调用的方法的委托。然后你做类似dict["string"].Value.Invoke()

+1

这也是我的建议,除了'Func '不合法 - 使用'动作'代替。 – 2011-02-25 00:47:37

+0

更正了,谢谢澄清。 – 2011-02-25 00:48:33

相关问题