2016-05-29 98 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

使用動作類。在您的例子那就是:

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

太棒了,這正是我一直在尋找的!我每次都必須使用lambda表達式嗎?或者我能否通過現有的方法?說,像新的行動(myAlreadyExistingMethod()); –

+0

經過快速測試:是的,你可以。對於任何人想知道它像新的Action(myAlreadyExistingMethod)一樣簡單; //方法名稱後沒有括號 –

+0

感謝您接受的答案。我希望我能幫到:) –

1

是,代表們要走的路。您可以根據您的需求使用代表ActionFunc的不同代表味道。這是你想要達到的目標嗎?

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

正如我在我的回答中提到的那樣,可以根據要從DoAction返回的輸入參數和輸出使用不同風格的Action和Func。如果沒有輸入參數,則使用簡單的操作。很高興我能幫上忙。 –