2012-11-26 32 views
0

這個月兩次,我不得不創建一個類的記錄一堆。 (兩個不同的課程),這將再次發生。在我看來,應該有一種簡單的方法來爲任何類使用反射,而無需爲每個類編寫總計例程。方法在一個類的列表中的總數據

考慮:

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); 
} 

顯然,在這種示例類數字三個屬性是很容易的代碼,但我只是做了一個與60組數字的成員。我摸索着思考了一陣子,但無法拿出一個例程。

+0

你可以使用linq? – clamchoda

+0

具有60個唯一數字字段的類有點味道...你確定你需要總結無關的字段嗎?考慮更改爲排序列表... –

+0

那麼如何「添加」沒有定義的「+」運算符的任何字段? – Servy

回答

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()); 

請注意,我只樣本與性質的作品。如果您有需要彙總的字段,則必須在類型上使用GetFields方法。

你也應該知道處理其他數字類型以及如Int64等...

-1

這是你在找什麼?

ThisAndThat thisThatSum = 0; 

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

我敢肯定LINQ,方式中存在過,但我不得不喜歡做研究和東西來獲取你

-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()); 
相關問題