Использование одного делегата для нескольких методов с разными параметрами - PullRequest
3 голосов
/ 21 февраля 2010

Можно ли как-то использовать один делегат для нескольких методов с разными параметрами? Я использую рефлексию, чтобы получить все методы в классе, и я хочу назначить каждому из них делегат и сохранить этот делегат в словаре с перечислением в качестве ключа. Это если для реализации удаленного вызова процедуры, над которой я работаю, enum - это команда, связанная с методом.

Привет / Per

Ответы [ 5 ]

1 голос
/ 21 февраля 2010

Вы можете использовать функцию Delegate.CreateDelegate и передать соответствующий тип делегата (Action<> или Func<>) и экземпляр MethodInfo, в этом случае вы должны создать тип делегата в соответствии с параметрами MethodInfo. *

1 голос
/ 21 февраля 2010

Вам потребуется единый способ передачи им параметров. Это означает, что вам нужно передать им массив параметров. А это значит, что вам нужен MethodInfo, а не делегат.

Просто сохраните MethodInfo против имени в словаре. Затем, когда вам нужно вызвать их, используйте метод Invoke , чтобы выполнить вызов, передав целевой объект и массив параметров.

0 голосов
/ 21 февраля 2010

Вы могли бы сделать Dictionary<MyEnum, Object> ;. После извлечения значения приведите его к соответствующему делегату и вызовите его.

С другой стороны, вы можете использовать что-то вроде шаблона команды и передавать команды, а не перечисляемые значения:

interface ICommand
{
    void Execute();
}

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

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

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

Если вы хотите, чтобы они были доступны как enum, вы можете создать фабричный класс со статическими методами для создания ваших конкретных команд:

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

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

Edit:

Кроме того, не уверен в своих потребностях, но раскрываю список вызовов методов, которые может захотеть сделать пользователь, но абстрагирование именно того, что вызывается, звучит как интерфейс:

interface IRemoteCommand
{
    void RemoteMethod();
    void OtherRemoteMethod(/* params */);
    void ImplementedAgainstADifferentServerMethod();
}
0 голосов
/ 21 февраля 2010

То, что вы можете попробовать, похоже на делегат BCL EventHandler и класс параметров EventArgs:

Вместо прямой передачи всех аргументов делегату / методу в качестве параметров, вы помещаете их в объект некоторого известного базового типа, а затем передаете этот объект делегату:

class FooArgs { ... }

delegate void FooDelegate(FooArgs args);

Затем для всех ваших методов, требующих определенных параметров, выведите новый класс из FooArgs, который содержит все ожидаемые параметры.

(Хотя это может показаться обходным, но, вероятно, это единственный вариант, поскольку все ваши методы в словаре должны иметь одинаковую «сигнатуру» с делегатом, то есть одинаковое количество параметров, одинаковые типы параметров, одинаковый тип возвращаемого значения. )

0 голосов
/ 21 февраля 2010

Если количество параметров, порядок и тип совпадают, да.

Проще говоря, делегат - это просто сигнатура метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...