我有两个班级Invoice
和InvoiceProducts
。 InvoiceProducts
是一个集合,并且只有一个名为Price
的get属性,我希望Invoice
拥有一个名为TotalPrice
的属性,该属性将返回Price
foreach项目添加了InvoiceProducts
个集合。但是,我不确定是否会这样做。按照目前的方式,我试图使用它,我得到一个错误说
"对象引用未设置为对象的实例。"有没有办法做到这一点?
目前的方式:
public class Invoice
{
public int InvoiceID { get; set; }
public string ClientName { get; set; }
public DateTime Date { get; set; } = DateTime.Today;
private decimal totalPrice;
public decimal TotalPrice {
get
{
return totalPrice;
}
set
{
foreach(var item in InvoiceProducts)
{
totalPrice += item.Price;
}
}
}
public virtual ICollection<InvoiceProducts> InvoiceProducts { get; set; }
}
public class InvoiceProducts
{
public int InvoiceProductsID { get; set; }
public int InvoiceID { get; set; }
public int ProductID { get; set; }
public int ProductQuantity { get; set; }
public decimal Price { get { return Product.ProductPrice * ProductQuantity; } }
public virtual Invoice Invoice { get; set; }
public virtual Product Product { get; set; }
}
答案 0 :(得分:3)
public decimal TotalPrice {
get
{
return InvoiceProducts.Sum(product => product.Price);
}
}
或更短,因为它只得到:
public decimal TotalPrice => InvoiceProducts.Sum(product => product.Price);
当然,您需要初始化您的产品列表,并且可能仅限于此。
public Invoice()
{
InvoiceProducts = new List<InvoiceProcuct>();
}
public ICollection<InvoiceProduct> InvoiceProducts { get; }
答案 1 :(得分:0)
我看到这已经回答了,但我想提供一些额外的说明,如果我可以尝试的话。 set
接受参数,并且是您根据要为其分配属性时分配属性值时要运行的特殊逻辑。举一个简单的例子:
public class SpecialNumber
{
private double _theNumber;
public double TheNumber
{
get { return _theNumber; }
set
{
_theNumber = value * Math.PI;
}
}
}
保留字value
是表达式的右侧:
specialNumberObject.TheNumber = 5.0;
因此,setter内的值将为5.0。 S. Spindler指出你在setter中的逻辑非常适合get
,因为它定义了一个自定义返回,只要我们想访问你就想要执行属性的值。
我的类的另一个版本可能决定在出路时有一个乘以PI的属性,如果我班级的后端逻辑依赖于数字,那么这可能很有用。未经形成的形式。在这种情况下,逻辑更适合吸气剂。
我希望我没有把这个问题搞糊涂。