如何创建方法列表然后执行它们?

时间:2014-05-02 22:37:58

标签: c# list methods

我正在尝试创建一个包含方法的列表,在我添加一些我想要执行它们的方法后,这可能吗?

我试过这样的事情:

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

然后:

methods.Add(Move());

但是当我添加时,程序会调用这些方法,例如,在这种情况下它会调用Move();

4 个答案:

答案 0 :(得分:26)

这是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:Action Delegate

答案 1 :(得分:2)

您可以使用代理人。创建委托列表。然后,对于要添加到列表的每个方法,创建一个委托并添加到列表中。

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

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

答案 2 :(得分:0)

我不确定这是否超出了原始问题的范围(或将对其他人有所帮助),但是我一直回到本页面,以寻找如何创建返回类型函数列表以进行迭代的方法并执行。我最终使用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使用情况的更多信息- What is Func, how and when is it used

答案 3 :(得分:0)

取决于所需的参数:

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),
};

如果您想知道需要在列表中输入的内容,我总是使用此“技巧”: Trick to get the parameters