如何在C#中创建未知/泛型类型的列表?

如何在C#中创建未知/泛型类型的列表?,c#,generics,C#,Generics,我注意到我一次又一次地做同样的事情,并希望创建一个更通用的方法来将数据表中的行转换为特定的类 由于我没有使用泛型类型的经验,我发现很难知道如何搜索我想要的,但我会尽力解释 我创建了这个类: public class Class1 { public Guid? Id{ get; set; } public string Text1{ get; set; } public string Text2{ get; set; } public int TheNumber{

我注意到我一次又一次地做同样的事情,并希望创建一个更通用的方法来将数据表中的行转换为特定的类

由于我没有使用泛型类型的经验,我发现很难知道如何搜索我想要的,但我会尽力解释

我创建了这个类:

public class Class1
{
    public Guid? Id{ get; set; }
    public string Text1{ get; set; }
    public string Text2{ get; set; }
    public int TheNumber{ get; set; }
}
然后我从一个表示Class1的数据库中获取数据。我以数据表的形式返回结果。datarows列中的名称与我的类中的名称完全相同,因此我认为可以在泛型方法中使用它们来创建Class1的实例

此时,我创建了如下实例:

public static Class1 AssembleClass1(DataTable dtInfo)
    {
        Class1 obj = null;

        if (dtInfo != null)
        {
            DataRow dr = dtInfo.Rows[0];
            obj = new StrategicObjectives();
            obj.Id= (Guid)dr["Id"];
            obj.Text1 = dr["Id"].ToString();
            obj.Text2 = dr["Id"].ToString();
            obj.TheNumber = (int)dr["TheNumber"];
        }

        return obj;
    }
现在,我想做的是创建一个采用dataTable和Class1类型的泛型方法(因为我的项目中有许多其他类,所以我希望能够做同样的事情)。 然后,它应该创建Class1类型的列表并迭代Class1的参数,在datatable的行中找到相应的datacolumn,并将正确的datarow值分配给Class1的正确参数。 我猜它还需要检查Class1的每个参数的类型,以正确转换datarow列类型

我自己只走了这么远,但我不知道这是否正确,也不知道如何继续

public static List<T> AssembleItem<T>(DataTable dtItems)
    {
        List<T> items = null;

        if (dtItems != null)
        {
            items = new List<T>();

            foreach (DataRow dr in dtItems.Rows)
            {
                object item = (T)Activator.CreateInstance(typeof(T));
            }
        }

        return items;
    }
公共静态列表集合项(数据表dtItems)
{
列表项=空;
if(dtItems!=null)
{
项目=新列表();
foreach(dtItems.Rows中的数据行dr)
{
objectitem=(T)Activator.CreateInstance(typeof(T));
}
}
退货项目;
}

我希望有人能在这方面帮助我,如果你需要更多信息,请问我。

要部分回答这个问题,不必使用反射来设置类型;您可以使用类型约束来要求无参数构造函数,如下所示

public static List<T> AssembleItem<T>(DataTable dtItems) where T : new()
{
    List<T> items = null;
    if (dtItems != null)
    {
        items = new List<T>();
        foreach (DataRow dr in dtItems.Rows)
        {
            T item = new T();
            // populate item from dr
            items.Add(item);
        }
    }
    return items;
}
公共静态列表集合项(DataTable dtItems),其中T:new()
{
列表项=空;
if(dtItems!=null)
{
项目=新列表();
foreach(dtItems.Rows中的数据行dr)
{
T项=新的T();
//从dr中填充项目
项目。添加(项目);
}
}
退货项目;
}

您可以使用反射来获取类的属性名称并填充它们

public static List<T> AssembleItem<T>(DataTable dtItems) where T : new()
{
    List<T> items = null;
    if (dtItems != null)
    {
        items = new List<T>();
        foreach (DataRow dr in dtItems.Rows)
        {
            T item = new T();
            foreach (DataRow dr in dtItems.Rows)
            {
                T item = new T();

                Type t = typeof (T);
                foreach (var property in t.GetProperties(BindingFlags.Public))
                {
                    var propertyname = property.Name;

                    //var data = ...get data from row in database with same column name as   propertyname

                    property.SetValue(item,data);
                }
                // populate item from dr
                items.Add(item);
            }
        }
        return items;
    }
}
公共静态列表集合项(DataTable dtItems),其中T:new()
{
列表项=空;
if(dtItems!=null)
{
项目=新列表();
foreach(dtItems.Rows中的数据行dr)
{
T项=新的T();
foreach(dtItems.Rows中的数据行dr)
{
T项=新的T();
类型t=类型(t);
foreach(t.GetProperties(BindingFlags.Public)中的var属性)
{
var propertyname=property.Name;
//var data=…从数据库中与propertyname具有相同列名的行中获取数据
设置值(项目、数据);
}
//从dr中填充项目
项目。添加(项目);
}
}
退货项目;
}
}

首先,您必须了解dynamic关键字、Emit code和CasleProject:)
obj.Text1=dr[“Id”].ToString()
你的意思是
dr[“Text1”].ToString()
dr[“Text2”]
)相应地吗?为什么不使用像Dapper这样简单的orm映射程序?HimBromBeere:是的,这是一个复制/粘贴错误。但是你说得对:)谢谢,这让我走上了正确的方向!