簡體   English   中英

使用一個委托來處理具有不同參數的多個方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM