一个类列表中的总数据的方法

时间:2012-11-26 20:26:29

标签: c# generics reflection

本月两次,我不得不创建一组一类的记录。 (两个不同的类),这将再次发生。在我看来,应该有一个简单的方法来使用任何类的反射,而无需为每个类编写一个总计例程。

考虑一下:

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个数字成员的属性。我沉迷于反思一段时间,但无法提出例行公事。

3 个答案:

答案 0 :(得分: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等...

答案 1 :(得分:-1)

这是你要找的吗?

ThisAndThat thisThatSum = 0;

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

我确定一种linq,方式也存在,但我不得不喜欢做研究和东西才能得到它

答案 2 :(得分:-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());