如何在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:是的,这是一个复制/粘贴错误。但是你说得对:)谢谢,这让我走上了正确的方向!