Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法来合计类列表中的数据_C#_Generics_Reflection - Fatal编程技术网

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个唯一的数字字段。。。您确定需要对无关字段求和吗?考虑更改为排序列表……那么,如何“添加”没有定义的“+”操作符的任何字段?