在动态对象上创建 运行 的方法列表

Create list of Methods to run on Dynamic Objects

所以假设我有一些已经为 class 定义的数字方法。

例如:

private int X(int a, int b)
{
    return a + b;
}

private int Y(int a, int b)
{
    return a - b;
}

private int Z(int a, int b)
{
    return a * b;
}

现在,通过所有函数在 class 和 运行 主体中获取输入的标准方法显然是像这样调用每个函数:

public void processNormal(int a, int b)
{
    //accumulate results
    int acc = 0;
    if (true)
    {
        //if want to add to current
        acc += X(a, b);
        acc += Y(a, b);
        acc += Z(a, b);
    }
    else
    {
        //if want to replace current if larger
        int k = X(a, b);
        if (k > acc)
            acc = k;

        k = Y(a, b);
        if (k > acc)
            acc = k;

        k = Z(a, b);
        if (k > acc)
            acc = k;
    }
}

现在我很好奇,因为随着函数数量的增加,取决于您可能希望对函数结果执行多少操作,如果这不会变得有点麻烦的话。你可以创建一个你想要的函数的静态列表 运行,然后在 for 循环中使用它来缩短事情,我想它看起来像这样:

//List with all methods
List<Object> methods = new List<Object>();
//add all methods to list

public void processWithList(int a, int b)
{
    //accumulate results
    int acc = 0;
    foreach (Object j in methods)
    {
        if (true)
        {
            //if want to add to current
            acc += j(a, b);
        }
        else
        {
            //if want to replace current if larger
            int k = j(a, b);
            if (k > acc)
                acc = k;
        }
    }
}

现在有了第二个过程,您仍然需要在某处定义列表,但我想随着事情的发展,更容易跟踪。所有函数都将采用相同的输入,并且 return 相同的对象,因此在这方面这不是问题。

我基本上想知道

A) 我愚蠢地把事情复杂化了,如果这样做有用的话。

B) 这样的东西在 C# 中会是什么样子?我可以在列表中使用预定义的 class 方法,还是必须在 class' 初始化中使用一堆委托函数生成列表?

感谢您的宝贵时间。

Am I stupidly over complicating things and if this would ever be a useful thing to do?

不,你做得很好。这是一种常见的方法。

What would such a thing look like in C#?

我认为与您的示例代码匹配的最简单选项是使用 List<Func<int, int, int>>

这是一个示例实现:

public class YourClass
{
    private List<Func<int, int, int>> methods;

    public yourClass()
    {
        methods = new List<Func<int, int, int>>()
        {
            (a,b) => X(a,b),
            (a,b) => Y(a,b),
            (a,b) => Z(a,b)
        };

    }

    public int SumMethods(int a, int b)
    {
        var result = 0;
        foreach(var m in methods)
        {
            result += m(a, b);
        }

        return result;
    }

    private int X(int a, int b) { throw new NotImplementedException(); }
    private int Y(int a, int b) { throw new NotImplementedException(); }
    private int Z(int a, int b) { throw new NotImplementedException(); }

}