C# 方法来合计类列表中的数据
这个月有两次,我不得不创建一个类的所有记录。(两个不同的类别)这种情况还会再次发生。在我看来,应该有一种简单的方法来实现这一点,即对任何类使用反射,而不必为每个类编写一个总计例程 考虑:C# 方法来合计类列表中的数据,c#,generics,reflection,C#,Generics,Reflection,这个月有两次,我不得不创建一个类的所有记录。(两个不同的类别)这种情况还会再次发生。在我看来,应该有一种简单的方法来实现这一点,即对任何类使用反射,而不必为每个类编写一个总计例程 考虑: private class ThisAndThat { public int This { get; set; } public float That { get; set; } public double TheOther { get; set; } public string
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 );
}
List_Discovered=newlist();
此和此总和=新列表;
当(!完成)
{
thisandtatcurrentone=GetAnotherOne();
_已发现。添加(CurrentOne);
合计(总计,当前一个);
}
显然,这个示例类中的三个数值属性很容易编码,但我只编写了一个包含60个数值成员的属性。我摸索着思考了一会儿,但想不出一个惯例 这就是你要找的吗
ThisAndThat thisThatSum = 0;
foreach(ThisAndThat tat in _Discovered)
{
thisThatSum.This += tat.This;
// do the same for other fields
}
我相信linq方法也是存在的,但我必须做一些研究和其他工作,才能让您了解它
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());
反思绝对可以做到这一点。这不太难。下面是一个使用您提供的类的示例:
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等。类中有60个唯一的数字字段。。。您确定需要对无关字段求和吗?考虑更改为排序列表……那么,如何“添加”没有定义的“+”操作符的任何字段?