2010-02-21 62 views
3

是否有可能以某種方式爲具有不同參數的多個方法使用一個代表? 我使用反射來獲取類中的所有方法,並且我想爲它們分配一個委託,並將該委託保存在字典中,枚舉作爲鍵。 這對於我正在處理的遠程過程調用實現來說,enum是一個與方法相關的命令。使用一個代理來處理不同參數的幾種方法

問候/每

回答

0

如果參數數量,順序和類型是相同的,是的。

簡而言之,委託只是一個方法簽名。

1

你需要一個統一的方式來傳遞參數。這意味着你需要傳遞一個參數數組。這意味着你需要一個MethodInfo,而不是一個代表。

只需在字典中存儲MethodInfo的名稱。然後,當您需要調用它們時,請使用Invoke方法進行調用,傳遞目標對象和參數數組。

0

有些事情,你可以嘗試類似於BCL的EventHandler代表和EventArgs參數類:

,而不是直接將所有參數傳遞給委託/方法的參數,你把他們的一些已知基本類型的對象內然後你對象傳遞給委託:

class FooArgs { ... } 

delegate void FooDelegate(FooArgs args); 

然後,對於所有的方法需要一定的參數,得出從FooArgs一個新的類,它包含所有需要的參數。 (雖然這可能看起來像一個彎路,但它可能是唯一的選擇,因爲字典中的所有方法都需要與委託具有相同的「簽名」,即相同數量的參數,相同的參數類型,相同的返回類型)

0

你可以製作一個Dictionary<MyEnum, Object>;。提取值後,將其轉換爲相應的委託並調用它。

或者,你可以使用類似的命令模式,並通過在命令而不是枚舉值:

interface ICommand 
{ 
    void Execute(); 
} 

class SomeCommand : ICommand 
{ 
    public SomeCommand(/* instance and parameters go here */) { /* ... */ } 

    public void Execute() { /* ... */ } 
} 

class SomeOtherCommand : ICommand { /* ... */ } 

如果你希望他們像一個枚舉訪問,你可以做一個工廠類W /靜態方法來創建特定的命令:

class RemoteCommand 
{ 
    public static SomeCommand SomeCommand 
    { 
     get 
     { 
      var result = new SomeCommand(/* ... */); 
      // ... 
      return result; 
     } 
    } 

    public static SomeOtherCommand SomeOtherCommand { get { /* ... */ } } 
} 

編輯:

而且,不知道您的需求,但暴露的方法列表調用使用[R可能要打,但是抽象出來到底是什麼被稱爲確保聲音等的接口:

interface IRemoteCommand 
{ 
    void RemoteMethod(); 
    void OtherRemoteMethod(/* params */); 
    void ImplementedAgainstADifferentServerMethod(); 
} 
1

您可以使用Delegate.CreateDelegate功能,並通過適當的委託類型(Action<>Func<>)和MethodInfo的實例,在這種情況下,您應該根據MethodInfo參數構造委託類型。

相關問題