2016-05-29 5 views
1

Так что я в основном пытаюсь создать динамическую структуру меню на C#. У меня есть элемент меню (только прямоугольник с некоторым текстом на нем в этой точке), который содержит метод DoAction(). Этот метод запускается всякий раз, когда нажимается прямоугольник. Я хочу, чтобы метод DoAction мог быть определен во время выполнения. Так, например, я мог бы создать элемент меню, метод DoAction() которого выполняет функцию x(), а затем создать экземпляр другого элемента меню, метод DoAction() которого выполняет функцию y(). У меня что-то вроде этого.Создать класс с динамическими методами

public class MenuElement { 
    public void DoAction(); // method I want to be dynamic 

    public MenuElement((text, height, width, etc), method myMethod){ 
     DoAction = myMethod; 
    } 
} 

MenuElement m1 = new MenuElement(..., function x()); 
MenuElement m2 = new MenuElement(..., function y()); 

m1.DoAction(); // calls x() 
m2.DoAction(); // calls y() 

Это та вещь, которую я знаю, как это сделать в Javascript, но я не знаком с C#, и я подозреваю, что .Net заставит меня прыгать через еще несколько обручей, чем бы JS. Из того, что я читаю, мне придется использовать делегатов? Я не могу найти какие-либо учебники, которые я действительно могу легко выполнить.

ответ

2

Используйте Action-Class. В вашем примере это будет:

public class MenuElement { 
public Action DoAction; // method I want to be dynamic 

public MenuElement((text, height, width, etc), Action myMethod){ 
    DoAction = myMethod; 
} 
} 

MenuElement m1 = new MenuElement(..., new Action(() => { 
// your code here 
}); 

MenuElement m2 = new MenuElement(..., new Action(() => { 
// your code here 
)); 

m1.DoAction(); // calls x() 
m2.DoAction(); // calls y() 

Для получения дополнительной информации см MSDN

+0

Удивительно, это именно то, что я искал! Должен ли я каждый раз использовать лямбда-выражение? Или я смогу пройти уже существующий метод? Скажем, что-то вроде нового действия (myAlreadyExistingMethod()); –

+0

После быстрого теста: да, вы можете. Для тех, кто задается вопросом, как это просто, как новое действие (myAlreadyExistingMethod); // без скобок после имени метода –

+0

Спасибо за принятый ответ. Надеюсь, я смогу помочь :) –

1

Да, делегаты путь. Вы можете использовать различные вкусы делегатов Action и Func для вашего требования. Это то, чего вы пытаетесь достичь?

public class MenuElement 
{ 
    public MenuElement(string text, int height, int width, Action<object> myMethod) 
    { 
     DoAction = myMethod; 
    } 

    public Action<object> DoAction { get; private set; } 
} 

     MenuElement m1 = new MenuElement("text", 10, 20, (obj) => { Console.WriteLine("MenuElement1"); }); 
     m1.DoAction(null); 


     Action<object> y = (obj) => 
     { 
      Console.WriteLine("MenuElement2"); 
     }; 

     MenuElement m2 = new MenuElement("text", 10, 20, y); 
     m2.DoAction(null); // calls y() 
+0

Ты джентльмен и ученый, сэр. Это отличный ответ. Это дает дополнительную синтаксическую доброту. Единственная причина, по которой я дал Иордану галочку, состоял в том, что мне больше нравился его синтаксис (DoAction (null) кажется немного громоздким). –

+1

Как я уже упоминал в своем ответе, существуют различные варианты Action и Func, которые можно использовать на основе входных параметров и вывода, которые вы хотите вернуть из DoAction. Если входной параметр отсутствует, вы используете простое действие. Рад, что я мог бы помочь. –

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