【问题标题】:c# Function to accept and process Object of Type Tc#函数接受和处理类型T的对象
【发布时间】: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

标签: c# generics .net-core


【解决方案1】:

您的Model1 类型使用它读取和写入的名为TotalVal 的属性,并使用它读取的名为BaseValue 的属性。为了使这个通用,该类型需要约束到至少一个定义TotalVal getter 和setter 做什么以及BaseValue getter 做什么的接口。

使用泛型类型约束where T: IModel 指定它。见documentation for where

那么你所有的具体模型类都应该实现IModel 接口。

至少是这样的:

interface IModel {
    decimal TotalVal { get; set; }
    decimal BaseValue { get; }
}

class SomeClass
{
    private static List<T> UniformDistribute<T>(List<T> inputList,
        decimal amountToDistribute, decimal total) where T : IModel
    {

        decimal totalRemaining = total;

        foreach (T 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2010-11-25
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    相关资源
    最近更新 更多