是否有可能以某種方式爲具有不同參數的多個方法使用一個代表? 我使用反射來獲取類中的所有方法,並且我想爲它們分配一個委託,並將該委託保存在字典中,枚舉作爲鍵。 這對於我正在處理的遠程過程調用實現來說,enum是一個與方法相關的命令。使用一個代理來處理不同參數的幾種方法
問候/每
是否有可能以某種方式爲具有不同參數的多個方法使用一個代表? 我使用反射來獲取類中的所有方法,並且我想爲它們分配一個委託,並將該委託保存在字典中,枚舉作爲鍵。 這對於我正在處理的遠程過程調用實現來說,enum是一個與方法相關的命令。使用一個代理來處理不同參數的幾種方法
問候/每
如果參數數量,順序和類型是相同的,是的。
簡而言之,委託只是一個方法簽名。
你需要一個統一的方式來傳遞參數。這意味着你需要傳遞一個參數數組。這意味着你需要一個MethodInfo
,而不是一個代表。
只需在字典中存儲MethodInfo
的名稱。然後,當您需要調用它們時,請使用Invoke方法進行調用,傳遞目標對象和參數數組。
有些事情,你可以嘗試類似於BCL的EventHandler
代表和EventArgs
參數類:
,而不是直接將所有參數傳遞給委託/方法的參數,你把他們的一些已知基本類型的對象內然後你對象傳遞給委託:
class FooArgs { ... }
delegate void FooDelegate(FooArgs args);
然後,對於所有的方法需要一定的參數,得出從FooArgs
一個新的類,它包含所有需要的參數。 (雖然這可能看起來像一個彎路,但它可能是唯一的選擇,因爲字典中的所有方法都需要與委託具有相同的「簽名」,即相同數量的參數,相同的參數類型,相同的返回類型)
你可以製作一個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();
}
您可以使用Delegate.CreateDelegate
功能,並通過適當的委託類型(Action<>
或Func<>
)和MethodInfo的實例,在這種情況下,您應該根據MethodInfo參數構造委託類型。