如何从C#中的通用List <t>中获取元素?</t>

时间:2014-02-13 13:49:21

标签: asp.net c#-4.0 asp.net-web-api

我有一个将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'

2 个答案:

答案 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方法参数。