2011-09-09 3 views
19

Итак, у меня есть 2 класса с именами A и B.Динамически присвоить метод/метод как переменную

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

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

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

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

ответ

7

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

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

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

48

Похоже, вы хотите использовать delegate здесь.

В принципе, вы можете добавить в классе "Б":

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

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

Затем можно установить:

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".

+1

+1 для простого, простого примера – JohnD

+0

thx много работает. Мне не хватало ключевое слово «Действие» :) – nr1

+1

@ nr1: на самом деле есть много вариантов - «Действие» позволит вам использовать метод, который не возвращает значение и не принимает никаких параметров. Вы можете использовать 'Func ', если ваши методы все принимают int и возвращают строку, например. –

Смежные вопросы