簡體   English   中英

如何創建方法列表然后執行它們?

[英]How to create a list of methods then execute them?

我正在嘗試創建一個包含方法的列表,在添加一些方法后我想執行它們,這可能嗎?

我試過這樣的事情:

List<object> methods = new List<object>();

然后:

methods.Add(Move());

但是當我添加時,程序會調用方法,例如,在這種情況下它調用了Move();

這是Action通用委托的一個很好的用例。

List<Action> functions = new List<Action>();
functions.Add(Move);

foreach (Action func in functions)
   func();

如果你需要參數,我會使用 lambdas 來抽象它們:

List<Action> functions = new List<Action>();
functions.Add(Move);
functions.Add(() => MoveTo(1, 5));

foreach (Action func in functions)
   func();

委托類似於 C++ 中的函數指針,它保存函數“是什么”(不是您示例中的返回值),因此您可以像常規函數一樣調用它。 Action 泛型委托不接受任何參數也不返回任何內容,因此它是泛型“調用這些函數”的理想選擇。

MSDN for Action: 動作委托

有關 .NET 提供的不同類型委托的更多信息: https ://stackoverflow.com/a/567223/1783619

我不確定這是否超出了原始問題的范圍(或者會幫助其他人),但我一直回到這個頁面,以自己搜索如何創建一個返回類型函數列表來迭代和執行。 我最終使用List<Func<T>>來創建類型方法列表-

        bool RTrue()
        {
            Console.WriteLine("RETURNS TRUE");
            return true;
        }

        bool RFalse()
        {
            Console.WriteLine("RETURNS FALSE");
            return false;
        }

        List<Func<Boolean>> functions = new List<Func<Boolean>>();
        functions.Add(RTrue);
        functions.Add(RFalse);

        foreach (Func<Boolean> func in functions)
        {
            if (func() == true)
            {
                Console.WriteLine("IT WORKS");
            }
        }

有關 Func 用法的更多信息 - Func 是什么,如何以及何時使用

您可以使用委托。 創建代表列表。 然后,對於要添加到列表中的每個方法,創建一個委托並將其添加到列表中。

 List<Delegate> methods = new List<Delegate>();

 // creates an Action delegate implicitly
 methods.Add((Action)Move);

根據需要的參數:

var Actions = new List<Action<object, EventArgs>>
{
    ReconfirmOrderlines_Click,
    ModifyOrderlines_Click
};

或者,例如,當您想要創建一個列表以使用文本和 Click 事件在 ContextMenuStrip 中動態添加項目時:

var actions = new List<(string, Action<object, EventArgs>)>
{
    ("Send confirmation", ReconfirmOrderlines_Click),
    ("Send modification", ModifyOrderlines_Click),
};

如果你想知道你需要在列表中輸入什么,我總是使用這個“技巧”: 獲取參數的技巧

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM