【发布时间】:2021-04-22 15:23:47
【问题描述】:
我正在编写一个自定义方法,它将跨项目列表的特定属性对值进行 Pro-Rate
private List<Model1> UniformDistribute(List<Model1> inputList, decimal amountToDistribute, decimal total)
{
decimal totalRemaining = total;
foreach (Model1 item in inputList)
{
item.TotalVal = Math.Round(item.BaseValue + (item.BaseValue * amountToDistribute), 2, MidpointRounding.ToEven);
totalRemaining -= item.TotalVal;
}
if (totalRemaining != 0)
{
inputList.LastOrDefault().TotalVal += totalRemaining;
}
return inputList;
}
此方法亲评估 Model1 类型列表的属性 TotalVal 的值
我有几个不同类型的其他模型,例如 Model2 Model3 等,在此方法中使用了相同的属性( TotalVal 和 BaseValue )以及其他一些不同的属性
我们能否将 UniformDistribute 方法设为通用方法,可以使用任何模型 Model2 / Model3 调用,以避免使用 C# 重复相同的代码
我试图使其如下所示,但不确定如何根据 inputList 所基于的模型类型访问特定于 Model1/Model2/Model3 等的 foreach 中的属性
private IEnumerable<T> UniformDistribute<T>(IEnumerable<T> inputList, decimal amountToProrate, decimal total)
{
foreach (var item in inputList)
{
}
}
【问题讨论】:
-
它们是否有一个公共基类或一个公共接口来公开它们的公共属性?
-
ATM 没有公开通用属性的通用接口其中一个公开给 CSVHelper,恐怕可以为 CSVHelper 处理它,因为列标题等是在属性之上定义的跨度>
-
您需要将所有通用属性放入一个接口(可能称为
IModel),然后更改您的模型类以实现该接口。然后您可以将类型T更改为IModel(在您的UniformDistribute实现中)。 -
@MatthewWatson 我认为通用约束会更合适,因此仍然可以返回特定的模型类型:
where T : IModel。