Динамически назначать метод / метод как переменную - PullRequest
19 голосов
/ 10 сентября 2011

Итак, у меня есть 2 класса с именами A и B.

A имеет метод "public void Foo ()".

B имеет несколько других методов.

Мне нужна переменная класса B, которой будет присвоен метод Foo () класса A. Эта переменная должна впоследствии быть «выполнена» (=>, поэтому она должна выполнить назначенный метод класса A).

Как это сделать?

Ответы [ 2 ]

53 голосов
/ 10 сентября 2011

Звучит так, как будто вы хотите использовать делегат здесь.

По сути, вы можете добавить в класс "B":

class B
{
    public Action TheMethod { get; set; }
}

class A
{
    public static void Foo() { Console.WriteLine("Foo"); }
    public static void Bar() { Console.WriteLine("Bar"); }
}

Тогда вы можетеset:

B b = new B();

b.TheMethod = A.Foo; // Assign the delegate
b.TheMethod(); // Invoke the delegate...

b.TheMethod = A.Bar;
b.TheMethod(); // Invoke the delegate...

Это выведет "Foo", а затем "Bar".

11 голосов
/ 10 сентября 2011

Рид дал вам правильный ответ.Также стоит отметить, что вы можете использовать другие подписи делегатов, кроме Action.

Существуют общие версии, такие как Action<T> (один аргумент), Action<T1, T2> (два аргумента) и т. Д ... Также, если у вашего метода есть тип возвращаемого значения, проверьте Func<T, TResult>.

Или, конечно, вы можете определить свой собственный тип делегата.

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