c#动态调用函数,不用if else

时间:2018-05-24 10:06:00

标签: c#

好的,所以我感到非常懒惰,我想知道我是否可以通过函数指针或其他方式动态调用函数?

我可以将所有可能的函数放在数组中,并传递我不想执行的索引,而不是编写一堆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();
    }

2 个答案:

答案 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)

您可以将一堆FuncAction个代表添加到列表中,然后调用每个代理。如果你的方法没有参数并且什么都不返回,那么使用Action,如果它接受一个参数并且什么也不返回,那么使用Action<T>,其中T指定参数的类型。如果它返回了某些内容,则使用Func<T>,其中T指定返回类型。在Func<T>中,最后一项指定了返回类型以及指定参数类型之前的类型。有关更多详细信息,请参阅我的答案末尾的链接。有许多具有可变参数的ActionFunc个委托。如果它们都不能满足您的需求,请查看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;
}

请参阅FuncAction