2

C# クラスがあるとします。

public class Node
{
    public double A { get; set; }
    public double B { get; set; }
}

...そして、そのタイプのオブジェクトのリストを含む別のクラス:

public Buffer
{
    private List<Node> _nodes;
    ...
}

ここで、_nodes リスト内の Node オブジェクトの A の値の合計を計算する必要があるとします。次に、(個別に) B の合計を計算します。コードを複製することなく、「汎用」Sum() メソッドを使用してこれを行う方法はありますか?

たとえば、1 つのアプローチは次のようになります。

public class Buffer
{
    ...

    private double SumA()
    {
        double sum;

        foreach (Node node in _nodes)
        {
            sum += node.A;
        }

        return sum;
    }

    private double SumB()
    {
        double sum;

        foreach (Node node in _nodes)
        {
            sum += node.B;
        }

        return sum;
    }
}

ここでの問題は、SumA() と SumB() によって実装される基本的なアルゴリズムは同じですが、上記の場合は重複していることです。Node に合計が必要なプロパティがさらにある場合、または Sum() がはるかに複雑なプロセスである場合 (現在リファクタリングしている場合はどちらも当てはまります)、これは複雑になります。

質問を別の言い方をすれば、Sum() メソッドを 1 つだけ持つ方法はありますが、合計する必要があるリスト内のクラス Node のメンバーを操作する方法はありますか?

4

5 に答える 5

1

PropertyInfoは、メンバー (この場合はプロパティ) への参照のようなものです。

PropertyInfo info = typeof(Node).GetProperty("A");
double sum = 0;
foreach (Node node in _nodes) sum += (double)info.GetValue(node, null);

そして追加:

using System.Reflection;
于 2013-05-16T13:41:19.307 に答える
0

おそらく、任意の List タイプの拡張メソッドを作成することもできます

public class Buffer
{
    private List<Node> _nodes;
    private List<double> numsA;

    void MyMethod()
    {
        List<double> numsA = new List<double>();
        List<double> numsB = new List<double>();

        foreach (Node node in _nodes)
        {
            numsA.Add(node.A);
            numsB.Add(node.B);
        }
        double sumA = numsA.Sum();
        double sumB = numsB.Sum();
    }
}

public static class MyExtensions
{
    public static double Sum(this List<double> nodes)
    {
        double sum = 0;
        foreach (double node in nodes)
        {
            sum += node;
        }
        return sum;
    }
} 
于 2013-05-16T13:37:29.240 に答える