[英]How to change constructor of a class to recieve generic list of objects of already created class and constructor? (C#)
我有以下课程:
public class OrderArticlesAdapter : RecyclerView.Adapter
{
public List<OrderArticleViewModel> listOfOrderArticles;
.....
.....
//constructor
public OrderArticlesAdapter(List<OrderArticleViewModel> orderArticles, ....., .....)
{
listOfOrderArticles = orderArticles;
......
}
}
我希望该类不仅可以与OrderArticleViewModel
列表一起使用,而且还可以与Invoices
类型和任何其他类型的列表一起使用。 OrderArticleViewModel
类如下所示:
public class OrderArticleViewModel
{
public string ArticleId { get; set; }
public string LotId { get; set; }
public string ArticleName { get; set; }
public string PriceDiscount { get; set; }
public string ArticlePrice { get; set; }
public string ArticleQuantity { get; set; }
public string ArticleTotalPrice { get; set; }
public string Barcode { get; set; }
public string ExpireDate { get; set; }
public string LotName { get; set; }
public string ArticlePriceAfterDiscount
{
get
{
decimal priceDiscount;
if (!Decimal.TryParse(PriceDiscount, out priceDiscount))
{
priceDiscount = 0;
}
decimal articlePrice = Convert.ToDecimal(ArticlePrice);
decimal discountAmount = Math.Round(articlePrice * (priceDiscount / 100), 4);
decimal articlePriceAfterDiscount = articlePrice - discountAmount;
return articlePriceAfterDiscount.ToString();
}
}
}
Invoices
类如下所示:
public class Invoices
{
public string ArtId { get; set; }
public string Name { get; set; }
public string Quantity { get; set; }
public string Price { get; set; }
public string Sum { get; set; }
public string Discount { get; set; }
public string PriceWodiscount { get; set; }
public string Id { get; set; }
}
ArticleId
, ArticleName
, ArticleQuantity
, PriceDiscount
, ArticlePrice
, Discount
, ArticlePriceAfterDiscount
从类OrderArticleViewModel
对应的属性ArtId
, Name
, Quantity
, Discount
, Price
, Sum
从类Invoices
。 如何使OrderArticlesAdapter
构造函数能够接收OrderArticleViewModel
或Invoices
或任何其他类型的通用列表,而又不破坏我已经使用OrderArticlesAdapter
实例的代码的功能?
创建另一个构造函数,在其中将发票清单转换为ArticleViewModel清单:
public class OrderArticlesAdapter : RecyclerView.Adapter
{
public List<OrderArticleViewModel> listOfOrderArticles;
public OrderArticlesAdapter(List<OrderArticleViewModel> orderArticles, ....., .....)
{
listOfOrderArticles = orderArticles;
}
public OrderArticlesAdapter(List<Invoice> invoices)
{
listOfOrderArticles = invoices.Select(MapToArticleVM).ToList();
}
private OrderArticleViewModel MapToArticleVM(Invoice invoice)
{
return new OrderArticleViewModel
{
ArticleId = invoice.ArtId,
// ...
};
}
}
请注意,结果列表将缺少某些属性,例如,由于Invoice
不包含Barcode
。
一种选择是编写扩展方法以将发票转换为视图模型
public static class InvoicesExtensions
{
public static OrderArticleViewModel ToOrderArticleViewModel(this Invoices i)
{
return new OrderArticleViewModel { ArticleId = i.ArtId, ... };
}
}
...然后您可以像这样调用构造函数
var invoices = new List<Invoices>();
var adapter = new OrderArticlesAdapter(invoices.Select(i => i.ToOrderArticleViewModel()).ToList());
我也建议
Invoices
重命名为Invoice
因为它似乎代表实际发票而不是多个发票 IEnumerable<OrderArticleViewModel>
代替List<OrderArticleViewModel>
作为构造函数参数,因为这使构造函数更加通用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.