本月两次,我不得不创建一组一类的记录。 (两个不同的类),这将再次发生。在我看来,应该有一个简单的方法来使用任何类的反射,而无需为每个类编写一个总计例程。
考虑一下:
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 :(得分: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());