我有一个将T List转换为DataTable的类。我的问题是我无法从通用List T中获取元素.T可以是entityFramework中的任何模型,例如:
public class Test
{
public string userId { get; set; }
public string email { get; set; }
public string name { get; set; }
}
所以List T等同于List Test
我的代码是:
public class ConvertListToDataTable<T>
{
public T Field;
public DataTable ConvertTest<T>(List<T> item)
{
DataTable dT = new DataTable();
foreach(T t in item)
{
// here I want to get the elements from T and put them into the DataTable
}
return dT;
}
}
我知道如何获取dataTable,但我不知道如何从列表中获取'userId','email','name'
答案 0 :(得分:1)
您无法仅从T
类型的对象访问任何属性的原因是因为T
几乎可以是任何东西 - 从泛型的角度来看,您如何才能预先知道哪些属性类型{{1}有吗?
如果您碰巧知道所有对象都基于公共接口或基类,那么您可以将generic constraint应用于T
类;这将允许编译器预先知道某个属性在基类级别可用于该类型。
但是如果你想允许ConvertListToDataTable<T>
成为任何类型,那么@MrFox是正确的,因为你需要使用Reflection来查看类型在运行时具有的属性并填充T
那样。
答案 1 :(得分:0)
反思可以解决这个问题:
public void Test(object t)
{
var properties = t.GetType().GetProperties();
foreach (var p in properties)
{
dT.Columns.Add(new DataColumn(p.Name, p.PropertyType));
}
var row = dT.NewRow();
int col = 0;
foreach (var p in properties)
{
row[col++] = p.GetValue(t);
}
}
如果只需要某种类型的属性,则可以提供GetProperties方法参数。