[英]Using one delegate to for several methods with different parameters
是否有可能以某種方式為一些具有不同參數的方法使用一個委托? 我使用反射來獲取類中的所有方法,並且我想為每個方法分配一個委托,並將該委托保存在以枚舉作為鍵的字典中。 這對於我正在處理的遠程過程調用實現,因此枚舉是與方法相關聯的命令。
商祺/每
你需要一種統一的傳遞參數的方法。 這意味着你需要傳遞一組參數。 這意味着您需要一個MethodInfo
,而不是一個委托。
只需將MethodInfo
存儲在字典中的名稱中即可。 然后,當您需要調用它們時,使用Invoke方法進行調用,傳遞目標對象和參數數組。
您可以使用Delegate.CreateDelegate
函數並傳遞相應的委托類型( Action<>
或Func<>
)和MethodInfo的實例,在這種情況下,您應該根據MethodInfo參數構造委托類型。
如果參數count,order和type相同,則為yes。
簡而言之,委托只是一種方法簽名。
你可以嘗試的東西類似於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 { /* ... */ }
如果您希望它們像枚舉一樣可訪問,您可以使用靜態方法創建工廠類來創建特定命令:
class RemoteCommand
{
public static SomeCommand SomeCommand
{
get
{
var result = new SomeCommand(/* ... */);
// ...
return result;
}
}
public static SomeOtherCommand SomeOtherCommand { get { /* ... */ } }
}
編輯:
此外,不確定您的需求,但是公開了用戶可能想要進行的方法調用列表,但是確切地抽象出被調用的內容確實聽起來像一個接口:
interface IRemoteCommand
{
void RemoteMethod();
void OtherRemoteMethod(/* params */);
void ImplementedAgainstADifferentServerMethod();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.