c# - 使用通用方法从数据表加载 List<T>

标签 c#

我用数据表加载了 10 个不同的 List< T >。 数据表是从 Sqlite 数据库加载的。 为此,我将相同的方法重复 10 次。 这是我的代码示例:

//List to be load
public static List<AircraftModel> Aircraft = new List<AircraftModel>();
public static List<AirlineModel> Airline = new List<AirlineModel>();

//Method to load the list Aircraft with the datatable
public void LoadAircraft(DataTable data)
    {
       foreach (DataRow row in data.Rows)
        {
          Aircraft.Add(new AircraftModel
            {
                Id = Int32.Parse(row["id"].ToString()),
                Registration = row["registration"].ToString(),
                Capacity = Int32.Parse(row["capacity"].ToString()),
                Type = row["type"].ToString()
            });
        }
    }

//Method to load the List Airline with datatable
public void LoadAirline(DataTable data)
    {
        foreach (DataRow row in data.Rows)
        {
            Airline.Add(new AirlineModel
            {
                Code = row["code"].ToString(),
                AirlineName = row["name"].ToString()
            });
        }
    }

是否可以使用像这样的通用方法来优化我的代码:

//call method to load the List
 GetData<AircraftModel>(Aircraft, datatable);
 GetData<AirlineModel>(Airline, datatable);

//Unique generic method to load the 10 List < T >
public void GetData<T>(List< T > ListToBeLoad, DataTable table)
       where T : class, new()
    {

        foreach (DataRow row in table.Rows)
        {
            ListToBeLoad.Add( new T
            {
              ......
              HELP NEEDED PLEASE
              ......
            }
        }            
    }

提前感谢您的回复和建议

西里尔

最佳答案

您有几个方法,您可以创建一个映射方法并将其作为参数传递,或者您可以使用 AutoMapper。

这是第一个解决方案的两个示例(没有 AutoMapper)

填充到现有列表的示例

PopulateList(list, dataTable, (row) =>
    new AircraftModel
    {
        Id = int.Parse(row["id"].ToString()),
        Registration = row["registration"].ToString(),
        Capacity = int.Parse(row["capacity"].ToString()),
        Type = row["type"].ToString()

    }
);

public static void PopulateList<T>(List<T> list, DataTable data, Func<DataRow, T> mapFunc)
    where T : new()
{
    foreach (DataRow row in data.Rows)
    {
        list.Add(mapFunc(row));
    }
}

创建新列表和映射行的示例。

var list2 = Map(dataTable, (row) =>
    new AircraftModel
    {
        Id = int.Parse(row["id"].ToString()),
        Registration = row["registration"].ToString(),
        Capacity = int.Parse(row["capacity"].ToString()),
        Type = row["type"].ToString()

    }
);

public static IEnumerable<T> Map<T>(DataTable data, Func<DataRow, T> mapFunc)
    where T : new()
{
    foreach (DataRow row in data.Rows)
    {
        yield return mapFunc(row);
    }
}

关于c# - 使用通用方法从数据表加载 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944930/

相关文章:

c# - 在扩展方法中实例化空对象

C# 隐式转换

c# - 为什么带有嵌套数组的 Marshal.PtrToStructure 会抛出 ExecutionEngineException?

c# - 阅读句子以制作字典或数组或关键字/关键短语列表

c# - 数据契约(Contract)异常。无法序列化

c# - Automapper 不忽略嵌套属性

c# - 在 WPF/C# 中通知可观察集合中的项目更改

c# - 将背景颜色应用于 GridView 中的所有标签

c# - 如何清理 web api 过滤器中字符串参数的值?

c# - 如何以编程方式绑定(bind)数据网格列?