我有一个公共 void 函数列表,它获取一个要执行的参数,我想使用循环来执行它,我不知道该怎么做,你能告诉我吗?我想将 mt 函数的名称插入到 arr 中,而不是像这样在循环中运行
string[] s1 = new string[3] {"func1", "func2", "func3"};
for(int i=0;i<s1.lengh;i++)
在这里我想调用函数......我该怎么做?
你有更好的报价吗?谢谢。
我有一个公共 void 函数列表,它获取一个要执行的参数,我想使用循环来执行它,我不知道该怎么做,你能告诉我吗?我想将 mt 函数的名称插入到 arr 中,而不是像这样在循环中运行
string[] s1 = new string[3] {"func1", "func2", "func3"};
for(int i=0;i<s1.lengh;i++)
在这里我想调用函数......我该怎么做?
你有更好的报价吗?谢谢。
您可以使用委托将函数作为参数/参数传递:
Action<T> action1 = func1;
Action<T> action2 = func2;
其中 T 是参数的类型(例如 int、string)
然后,您可以通过调用来运行这些引用的函数
action1(t);
action2(t);
其中 t 是您的函数的参数。
为了使这个示例有用,请考虑创建一个操作列表:
List<Action<T>> actions = new List<Action<T>>();
actions.Add(action1); actions.Add(action2);
foreach (Action<T> action in actions)
{
var t = param; // Replace param with the input parameter
action(t);
}
当然,你还必须有
using System;
在代码文件的顶部引用 Action。
另请参阅有关操作委托的 MSDN 文档:http: //msdn.microsoft.com/en-us/library/018hxwa8.aspx
您的第一个选择是使用委托(假设参数是整数):
var s1 = new Action<int>[3] { a => func1(a), a => func2(a), a => func3(a) }; // without quotes it creates a function pointer
for(int i=0;i<s1.Length;i++)
s1[i](parameter); // call the delegate
如果在编译时不知道函数名,使用反射调用方法:
var s1 = new string[3] {"func1", "func2", "func3"};
for(int i=0;i<s1.Length;i++)
this.GetType().GetMethod(s1[i]).Invoke(this, new object[] { parameter });
请注意this.GetType()
第二个示例中的 - 如果方法是在另一种类型上定义的,您很可能会使用它typeof(OtherType)
。
使用委托。例如,要调用接受一个参数但不返回任何值(即返回void
)的方法,请使用Action<T>
委托。假设您希望它们都接受相同的参数类型,它看起来有点像这样:
public void Action1(int x) { ... }
public void Action2(int x) { ... }
public void Action3(int x) { ... }
...
Action<int>[] actions = new Action<int>[] { Action1, Action2, Action3 }
for (int i = 0; i < actions.Length; i++)
{
actions[i](i); // Invoke the delegate with (...)
}
延伸阅读
我相信您想要做的事情可以通过一系列动作来完成。
假设每个函数的参数类型是整数,下面是它的样子:
List<Action<int>> functions = new List<Action<int>> {func1, func2, func3};
int i = 5;
foreach (Action<int> f in functions)
{
f(i);
}
编辑:更新每个更新的 OP,指定循环应该只在每个函数上。
string[] s1 = new string[3] {"func1", "func2", "func3"};
for(int i=0;i<s1.lengh;i++)
List<string, Func<string>> functionList = new List<string, Func<string>>();
functionList.Add(s1[0], ()=>{return "You called func1!";});
functionList.Add(s1[1], ()=>{return "You called func2!";});
functionList.Add(s1[2], ()=>{return "You called func3!";});
for(int i=0;i<s1.length;i++)
{
string retVal = functionList[s1[i]].Invoke();
}
var list = new List<Action<MyParameterType>>() {func1, func2, func3};
foreach(var func in list)
{
func(someValue);
}