我正在尝试创建一个包含方法的列表,在我添加一些我想要执行它们的方法后,这可能吗?
我试过这样的事情:
List<object> methods = new List<object>();
然后:
methods.Add(Move());
但是当我添加时,程序会调用这些方法,例如,在这种情况下它会调用Move();
答案 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),
};