Есть ли базовый класс всех делегатов в C# - PullRequest
2 голосов
/ 16 января 2020

Есть ли способ передать разные методы в качестве параметра в другой метод в C#? У меня есть такой код ниже

class Program
{
    void Action1(string s){...}
    string Func1(string s){...}

    void RegisterAction(Action<string> action){...}
    void RegisterFunc(Func<string, string> func){...}

    void Register(????){ }

    void Run()
    {
        RegisterAction(Action1); // ok
        RegisterFunc(Func1); // ok

        Register(Action1);  // ?
        Register(Func1);    //?  
    }
}

Я хочу передать Action1 и Func1 в один и тот же метод 'Register', в котором я могу использовать отражение для реализации своей логики c. но Action<string>, Func<string,string> - это разные делегаты, возможно, мне придется иметь дело с Action<int>, Func<object> и многими другими типами, я не хочу писать методы 'register' для каждого действия и функции.

Любая помощь? Спасибо.

1 Ответ

9 голосов
/ 16 января 2020

Там - это базовый тип - MulticastDelegate, который сам по себе имеет базовый тип Delegate - но проблема в том, что вы полагаетесь на преобразование группы методов в тип делегата, для которого требуется конкретный c тип делегата для преобразования. Register(Action1) может преобразовать группу методов Action1 в любой тип делегата, возвращающий void и принимающий string - таких делегатов может быть несколько. Как компилятор узнает, какой из них вы имеете в виду?

Что вы могли бы сделать, это сохранить ваши RegisterAction и RegisterFunc методы, но затем использовать общую реализацию, в которой делегаты хранятся в ( скажем) а List<Delegate>.

...