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;
计算同一对象中所有属性总数的有效方法是什么?
答案 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>();
}
}