0

今月 2 回、クラスのレコードを合計で作成する必要がありました。(2つの異なるクラス)そしてこれが再び起こります。クラスごとに合計ルーチンをコーディングすることなく、任意のクラスのリフレクションを使用してこれを行う簡単な方法があるはずです。

検討:

private class ThisAndThat
{
    public int This { get; set; }
    public float That { get; set; }
    public double TheOther { get; set; }
    public string Whatever { get; set; }
}

私のコードがゴロゴロするにつれて、これらの束を作成しますが、合計ルーチンも必要です。以下にリストされている AddToTotal() のようなもので、数値が追加され、文字列が無視されます。

List<ThisAndThat> _Discovered = new List<ThisAndThat>(); 
ThisAndThat _Total = new List<ThisAndThat>; 
while( !Finished )
{
    ThisAndThat CurrentOne = GetAnotherOne(); 
    _Discovered.Add( CurrentOne ); 
    AddToTotal( _Total, CurrentOne ); 
}

明らかに、このサンプル クラスの 3 つの数値プロパティは簡単にコーディングできますが、私は 60 の数値メンバーを持つものを作成しました。私はしばらく反省しながら手探りしましたが、ルーチンを思いつくことができませんでした。

4

3 に答える 3

2

リフレクションはこれを絶対に行うことができます。それほど難しくありません。提供したクラスを使用した例を次に示します。

var tat = new ThisAndThat();
tat.This = 1;
tat.That = 2.0F;
tat.TheOther = 3.0;
tat.Whatever = "Whatever";

var type = typeof(ThisAndThat);
var properties = type.GetProperties();

double total = 0.0;

foreach (System.Reflection.PropertyInfo pi in properties)
{
    switch (pi.PropertyType.ToString())
    {
        case "System.Int32": //int
            total += (int) pi.GetValue(tat, null);
            break;
        case "System.Double":
            total += (double) pi.GetValue(tat, null);
            break;
        case "System.Single": //float
            total += (float) pi.GetValue(tat, null);
            break;
    }
}

MessageBox.Show(total.ToString());

私のサンプルはプロパティでのみ機能することに注意してください。合計する必要があるフィールドがある場合は、Type で GetFields メソッドを使用する必要があります。

また、Int64 などの他の数値型の処理にも注意する必要があります...

于 2012-11-26T20:45:30.883 に答える
-1

これはあなたが探しているものですか?

ThisAndThat thisThatSum = 0;

foreach(ThisAndThat tat in _Discovered)
{
    thisThatSum.This += tat.This;
    // do the same for other fields
}

私は確かにlinq、方法も存在しますが、それをあなたに届けるために調査などを行う必要があります

于 2012-11-26T20:32:05.150 に答える
-1

Linq to sql を使用すると、IEnumerable でこれを非常に簡単に行うことができます

    ThisAndThat item1 = new ThisAndThat();
    ThisAndThat item2 = new ThisAndThat();

    item1.TheOther = 1.00;
    item2.TheOther = 2.00;

    _Discovered.Add(item1);
    _Discovered.Add(item2);

    var amount = from p in _Discovered
                 select p.TheOther;

    Console.WriteLine("Amount total is {0}", amount.Sum());
于 2012-11-26T20:45:04.253 に答える