如何计算C#中对象内所有属性的总和?

时间:2015-04-16 15:05:55

标签: c# object c#-4.0 .net-4.5

public class Calories
{
  public decimal A { get; set; }
  public decimal B { get; set; }
  public decimal C { get; set; }
  public decimal Total { get; set; }
}

var calories = new Calories
{ 
  A = 10, B = 25, C = 31
};

//Currently I am doing this
calories.Total = calories.A + calories.B + calories.C;

计算同一对象中所有属性总数的有效方法是什么?

4 个答案:

答案 0 :(得分:14)

是。您可以计算属性getter中的总和:

public decimal Total { get { return A + B + C } };

答案 1 :(得分:5)

没有真正回答你的问题,但是如果你对不同的设计持开放态度,并且你想要一个具有未确定数量的值的类具有Total属性..

class Calories : List<decimal>
{
    public decimal Total { get { return this.Sum(); } }
}

可能不是最好的方式..取决于具体情况,但快速和最小的代码。

答案 2 :(得分:2)

虽然这比简单地手动将小数一起添加到一起要快得多,但由于你明确地用字符串排除了Total属性,所以下面的反射只会对你的Decimal列进行总计而不会破坏它是否会遇到不属性的属性。小数点。

public class Calories
{
    public decimal A { get; set; }
    public decimal B { get; set; }
    public decimal C { get; set; }
    public string TestString { get;set;}

    public decimal Total 
    { 
        get
        {
            return typeof(Calories)
                .GetProperties()
                .Where (x => x.PropertyType == typeof(decimal) 
                    && x.Name != "Total")
                .Sum(p => (decimal)p.GetValue(this));
        }
    }
}

请记住,更好的类结构或Yuval的答案会更好,因为它可以正确地保持强类型和性能。我将此添加为完全性的“纯粹反思”答案。

最后,如果您想使用反射来动态访问未知数量的小数属性,但是您希望避免繁重的反射成本,则可以使用像FastMember这样的库来降低性能损失。

public class Calories
{
    public decimal A { get; set; }
    public decimal B { get; set; }
    public decimal C { get; set; }
    public string TestString { get;set;}

    public decimal Total 
    { 
        get
        {
            var accessor = FastMember.TypeAccessor.Create(this.GetType());

            return accessor.GetMembers()
                .Where (x => x.Type == typeof(decimal) && x.Name != "Total")
                .Sum(p => (decimal)accessor[this, p.Name]);
        }
    }
}

答案 3 :(得分:0)

我要做的是创建List Calories,在您的课程中,您可以在列表中拨打Property Total Sum

像这样:

public class Calories
{
  public List<decimal> Calories;
  public decimal Total{ get { return this.Calories.Sum(); } }

  public Calories()
  {
    this.Calories = new List<decimal>();
  }
}