如何在C#中计算Proto消息Affordability的总支出与剩余金额
在C#中计算Proto消息的剩余金额
首先,确保你已经通过Proto编译器将.proto文件生成了对应的C#类,生成的Affordability类会包含你定义的所有decimal类型属性。
直接计算实现
如果只是单次计算需求,直接对实例属性做加减运算即可:
// 假设已获取到Affordability实例 var affordability = new Affordability { Salary = 8000.00m, Accomodation = 2500.00m, PhoneBill = 300.00m, Utilities = 800.00m }; // 计算总支出 decimal totalExpenses = affordability.Accomodation + affordability.PhoneBill + affordability.Utilities; // 计算剩余金额 decimal amountLeft = affordability.Salary - totalExpenses; // 输出结果 Console.WriteLine($"总支出:{totalExpenses:C},剩余金额:{amountLeft:C}");
扩展方法实现(推荐复用场景)
如果需要在多处复用计算逻辑,给Affordability类写扩展方法会让代码更简洁易维护:
public static class AffordabilityExtensions { /// <summary> /// 计算总支出(accomodation + phone_bill + utilities) /// </summary> public static decimal GetTotalExpenses(this Affordability affordability) { return affordability.Accomodation + affordability.PhoneBill + affordability.Utilities; } /// <summary> /// 计算剩余金额(salary - 总支出) /// </summary> public static decimal GetAmountLeft(this Affordability affordability) { return affordability.Salary - affordability.GetTotalExpenses(); } }
调用扩展方法的示例:
var affordability = new Affordability { Salary = 8000.00m, Accomodation = 2500.00m, PhoneBill = 300.00m, Utilities = 800.00m }; decimal totalExpenses = affordability.GetTotalExpenses(); decimal amountLeft = affordability.GetAmountLeft(); Console.WriteLine($"总支出:{totalExpenses:C},剩余金额:{amountLeft:C}");
注意事项
- 核对编译后的属性名:Proto中下划线命名(如
phone_bill)默认会被编译为帕斯卡命名(如PhoneBill),请以实际生成的C#类属性名为准。 - 处理默认值:如果属性未赋值,decimal类型默认值为0,上述逻辑依然有效;若需处理特殊场景(如薪资为0的提示),可在方法中添加额外判断。
内容的提问来源于stack exchange,提问作者Chief_Muna
相关产品推荐
相关产品推荐

