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 个数字成员编写了一个。我在反思中摸索了一会儿,但无法想出一个例程。

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

请注意,我的示例仅适用于属性。如果您有需要总计的字段,则必须在类型上使用 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 回答