2011-02-25 84 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

相關問題