我正在尝试编写一个通用方法来处理以下代码:
foreach (var glitter in glitterpurchase.GlitterPurchaseDetails)
{
var glitterInventory = _db.GlitterInventoriesRepository.GetAll(m => m.GlitterId == glitter.GlitterId);
if (!glitterInventory.Any())
{
var newInventory = new GlitterInventory
{
GlitterId = glitter.GlitterId,
Quantity = glitter.Quantity,
TotalAmount = (decimal)glitter.Quantity * glitter.UnitPrice,
UnitPrice = glitter.UnitPrice,
CreatedBy = User.Identity.Name,
CreatedDate = DateTime.Now,
};
_db.GlitterInventoriesRepository.Insert(newInventory);
}
else
{
var updateInventory = glitterInventory.First();
updateInventory.Quantity += glitter.Quantity;
updateInventory.TotalAmount += (decimal)glitter.Quantity * glitter.UnitPrice;
updateInventory.UnitPrice = (decimal)updateInventory.Quantity / updateInventory.TotalAmount;
updateInventory.UpdatedBy = User.Identity.Name;
updateInventory.UpdatedDate = DateTime.Now;
_db.GlitterInventoriesRepository.Update(updateInventory);
}
}
上面的代码仅仅简单地更新存货。我想要制作一个通用的方法,这样我只需要调用那个方法就可以更新不同物品(类)的存货。我对泛型不太熟悉,在研究后我写了以下代码:
public virtual void UpdateInventory<PurchasedEntity, Inventory>(IEnumerable<PurchasedEntity> purchaseDetails, GenericRepository<Inventory> inventory, Expression<Func<Inventory, bool>> filterForInventory)
where PurchasedEntity : class
where Inventory : class
{
foreach (var item in purchaseDetails)
{
var glitterInventory = inventory.GetAll(filterForInventory);
if (!glitterInventory.Any())
{
var newInventory = (Inventory)Activator.CreateInstance(typeof(Inventory), new object[]
{
GlitterId = item.GlitterId,
Quantity = item.Quantity,
TotalPrice = (decimal)item.Quantity * item.UnitPrice,
UnitPrice = item.UnitPrice,
CreatedBy = User.Identity.Name,
CreatedDate = DateTime.Now,
});
inventory.Insert(newInventory);
}
else
{
var updateInventory = glitterInventory.First();
updateInventory.Quantity += item.Quantity;
updateInventory.TotalAmount += (decimal)item.Quantity * item.UnitPrice;
updateInventory.UnitPrice = (decimal)updateInventory.Quantity / updateInventory.TotalAmount;
updateInventory.UpdatedBy = User.Identity.Name;
updateInventory.UpdatedDate = DateTime.Now;
inventory.Update(updateInventory);
}
}
}
我遇到了以下错误:
'PurchasedEntity' does not contain a definition for 'GlitterId' and no extension method 'GlitterId' accepting a first argument of type 'PurchasedEntity' could be found (are you missing a using directive or an assembly reference?)
如何消除这个错误并以通用方式获取类的属性?
我甚至不知道我写的代码是否好,所以如果您能改进它,那将是很棒的。谢谢。
where PurchasedEntity : class
,这意味着可以使用任何类型作为此泛型参数。因此,泛型方法只能在使用 item 变量时使用 Object 类提供的方法、属性和字段——因为 Object 类是任何类型中最不常见的公共基类... 你需要以一种限制它仅适用于声明了 GlitterId、Quantity、UnitPrice 等属性的(基)类的方式来指定约束。然后编译器将接受代码。 - user2819245