C# 使用自定义属性将Datatable映射到列表的通用函数

C# 使用自定义属性将Datatable映射到列表的通用函数,c#,linq,lambda,C#,Linq,Lambda,下面是我的代码,其中我将数据表转换为类列表 var cities = ds.Tables[0].AsEnumerable().Select(c => new City { CityCode = c.Field<object>("CITY_CODE"), CityMid = c.Field<object>("CITY_MID"),

下面是我的代码,其中我将数据表转换为类列表

       var cities = ds.Tables[0].AsEnumerable().Select(c => new City
                {
                    CityCode = c.Field<object>("CITY_CODE"),
                    CityMid = c.Field<object>("CITY_MID"),
                    CityName = c.Field<object>("CITY_NAME"),
                    CountryCode = c.Field<object>("COUNTRY_CODE"),
                    StateCode = c.Field<object>("STATE_CODE"),
                    ActiveFlag = c.Field<object>("ACTIVE_FLG"),
                }).ToList();
如何创建一个泛型类来将数据表或映射转换为列表,在上面的示例中,我使用了类City,但是会有任何具有不同属性的类和具有任何列名的数据表。数据类型是Func,一个接受数据行并返回城市的函数:

我所知道的是,我必须返回表达式,但我不明白如何在任何类中返回表达式

c=>new City{…}是Func类型的委托,在某种程度上相当于获取数据行并返回城市的方法。因此,您可以为它创建一个方法

City ConvertToCity(DataRow row) =>
        new City
        {
            CityCode = row.Field<object>("CITY_CODE"),
            CityMid = row.Field<object>("CITY_MID"),
            CityName = row.Field<object>("CITY_NAME"),
            CountryCode = row.Field<object>("COUNTRY_CODE"),
            StateCode = row.Field<object>("STATE_CODE"),
            ActiveFlag = row.Field<object>("ACTIVE_FLG"),
        };

你能澄清一下你所说的任何课程是什么意思吗?你能举个例子说明你想做什么吗?public IEnumerable GetCitiesFuncselector@DaisyShipton任何类都意味着,我正在尝试创建公共方法,这样,如果我使用了另一个类,比如Employee,那么它应该给我我需要的输出required@Satsvelke:所以你会通过一个函数。。。我还是不确定这里少了什么。这就是为什么我要举一个例子来说明您正在努力实现的目标—您希望能够编写什么代码?基本上接受nvoigt的答案,但要使其通用:public IEnumerable GetValues Func selectorI将编辑问题,给我时间是!由于询问者使用.AsEnumerable,lambda表达式的类型将如您所说的Func。如果没有.AsEnumerable,另一个Linq提供程序可能变得相关,并且该提供程序可能需要表达式树而不是普通委托。在这种情况下,类型将是表达式。.Select的后一个重载由IQueryable接口声明,而带有普通委托的重载由其基本接口IEnumerable声明。不确定这是否有助于询问者;他确实提到了大写字母E的单词表达式。实际上,城市阶级及其属性是动态的,阶级可以是动态的Employee@Satsvelke您可以为此目的使用泛型。
var cities = GetCities(c => new City     
{
    CityCode = c.Field<object>("CITY_CODE"),
    CityMid = c.Field<object>("CITY_MID"),
    CityName = c.Field<object>("CITY_NAME"),
    CountryCode = c.Field<object>("COUNTRY_CODE"),
    StateCode = c.Field<object>("STATE_CODE"),
    ActiveFlag = c.Field<object>("ACTIVE_FLG"),
});
Func<DataRow, City> myfunc = c => new City     
{
    CityCode = c.Field<object>("CITY_CODE"),
    CityMid = c.Field<object>("CITY_MID"),
    CityName = c.Field<object>("CITY_NAME"),
    CountryCode = c.Field<object>("COUNTRY_CODE"),
    StateCode = c.Field<object>("STATE_CODE"),
    ActiveFlag = c.Field<object>("ACTIVE_FLG"),
};

var cities = GetCities(myfunc);
public IEnumerable<T> GetCities(Func<DataRow, T> selector)
{
    return ds.Tables[0].AsEnumerable().Select(selector).ToList();
}
City ConvertToCity(DataRow row) =>
        new City
        {
            CityCode = row.Field<object>("CITY_CODE"),
            CityMid = row.Field<object>("CITY_MID"),
            CityName = row.Field<object>("CITY_NAME"),
            CountryCode = row.Field<object>("COUNTRY_CODE"),
            StateCode = row.Field<object>("STATE_CODE"),
            ActiveFlag = row.Field<object>("ACTIVE_FLG"),
        };
var cities = ds.Tables[0].AsEnumerable().Select(ConvertToCity).ToList();