好的,所以我感到非常懒惰,我想知道我是否可以通过函数指针或其他方式动态调用函数?
我可以将所有可能的函数放在数组中,并传递我不想执行的索引,而不是编写一堆if else。
我在考虑某种链表。 例如。
//mainClass
private void initFunctionLL()
{
currNode.functionRef = this.funct1;
...
nextNode.functionRef = this.funct2;
}
private void callNext(){
currNode = currNode.Next();
currNode.execute();
}
//
//nodeClass
public void execute()
{
call myFunctionRef();
}
答案 0 :(得分:1)
如果您的函数具有相同的返回类型和相同的参数列表,那么您可以使用Func<T>
或Action
为此函数创建一组委托并调用它。没有参数但没有返回值的函数示例:
private void ExecuteManyFunctions()
{
List<Action> actions = new List<Action>();
actions.Add(Foo);
actions.Add(Bar);
foreach(var func in actions)
func();
}
private void Foo() => { // some logic here }
private void Bar() => { // some logic here }
具有整数参数的函数的另一个示例返回字符串:
private void ExecuteManyFunctions()
{
List<Func<string, int>> actions = new List<Func<string, int>>();
actions.Add(Foo);
actions.Add(Bar);
var results = new List<string>();
foreach(var func in actions)
results.Add(func(1));
}
private string Foo(int x) => { return x.ToString(); }
private string Bar(int y) => { return "staticResult"; }
答案 1 :(得分:0)
您可以将一堆Func
或Action
个代表添加到列表中,然后调用每个代理。如果你的方法没有参数并且什么都不返回,那么使用Action
,如果它接受一个参数并且什么也不返回,那么使用Action<T>
,其中T
指定参数的类型。如果它返回了某些内容,则使用Func<T>
,其中T
指定返回类型。在Func<T>
中,最后一项指定了返回类型以及指定参数类型之前的类型。有关更多详细信息,请参阅我的答案末尾的链接。有许多具有可变参数的Action
和Func
个委托。如果它们都不能满足您的需求,请查看Delegate。
例如,在下面的示例中,我声明了一个列表,该列表将包含一堆func,这些func占用一个int
并返回一个int
。然后我循环并调用每一个。第一个乘以传递给它的数字并返回产品,而第二个将数字加到自身。
var funcs = new List<Func<int, int>>();
funcs.Add(x => x * x);
funcs.Add(x => x + x);
funcs.Add(x => Square(x)); // Or like this
foreach (var thisFunc in funcs)
{
thisFunc(5);
}
private static int Square(int number)
{
return number * number;
}