2

我有一个公共 void 函数列表,它获取一个要执行的参数,我想使用循环来执行它,我不知道该怎么做,你能告诉我吗?我想将 mt 函数的名称插入到 arr 中,而不是像这样在循环中运行

string[] s1 = new string[3] {"func1", "func2", "func3"};
for(int i=0;i<s1.lengh;i++)

在这里我想调用函数......我该怎么做?

你有更好的报价吗?谢谢。

4

6 回答 6

3

您可以使用委托将函数作为参数/参数传递:

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

于 2013-10-31T15:02:32.497 回答
2

您的第一个选择是使用委托(假设参数是整数):

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)

于 2013-10-31T15:03:23.750 回答
2

使用委托。例如,要调用接受一个参数但不返回任何值(即返回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 (...)
}

延伸阅读

于 2013-10-31T15:03:33.670 回答
1

我相信您想要做的事情可以通过一系列动作来完成。

假设每个函数的参数类型是整数,下面是它的样子:

List<Action<int>> functions = new List<Action<int>> {func1, func2, func3};

int i = 5;
foreach (Action<int> f in functions)
{
     f(i);
}

编辑:更新每个更新的 OP,指定循环应该只在每个函数上。

于 2013-10-31T15:08:16.327 回答
0
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();
}
于 2013-10-31T15:10:16.090 回答
0
var list = new List<Action<MyParameterType>>() {func1, func2, func3};
foreach(var func in list)
{
   func(someValue);
}
于 2013-10-31T15:03:35.300 回答