代码之家  ›  专栏  ›  技术社区  ›  user3532232

C动态调用函数而不使用if-else

c#
  •  0
  • user3532232  · 技术社区  · 8 年前

    好吧,我觉得非常懒惰,我想知道我是否可以通过函数指针或者其他什么方式动态调用函数?

    我可以把所有可能的函数放在一个数组中,传递我不想执行的索引,而不是编写一堆if-else。

    我在想一个LinkedList。 如。

        //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 回复  |  直到 8 年前
        1
  •  1
  •   Vadim Martynov    8 年前

    如果函数具有相同的返回类型和相同的参数列表,则可以使用 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"; }
    
        2
  •  0
  •   CodingYoshi    8 年前

    你可以加一堆 Func 或 Action 委托给一个列表,然后调用每个列表。如果您的方法不接受任何参数且不返回任何值,则使用 行动 ,如果它接受一个参数而不返回任何值,则使用 Action<T> 其中: T 指定参数的类型。如果它返回某些内容,则使用 Func<T> ,其中 T 指定返回类型。在 功能 最后一项指定返回类型,而前面的项指定参数类型。有关更多详细信息,请参阅我答案后面的链接。有很多 行动 和 芬克 具有可变参数的委托。如果它们都不能满足你的需求,那就去看看 Delegate .

    例如,在下面的示例中,我声明了一个列表,其中包含一组函数 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;
    }
    

    请看 Func 和 Action .