【问题标题】:How to get the elements from a generic List<T> in C#? [duplicate]如何从 C# 中的通用 List<T> 中获取元素? [复制]
【发布时间】:2014-03-12 10:36:04
【问题描述】:

我有一个将 T 列表转换为 DataTable 的类。我的问题是我无法从通用列表 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;
        }
    }

我知道如何处理数据表,但我不知道如何从列表中获取 'userId'、'email'、'name'

【问题讨论】:

  • 现在我明白了.. 我搜索并没有找到。我希望解决方案对我有好处。谢谢

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


【解决方案1】:

您不能从 T 类型的对象中访问任何属性的原因是因为 T 可以是任何东西 - 从泛型的角度来看,您如何预先知道 T 具有哪些属性类型?

如果您碰巧知道所有对象都基于一个公共接口或基类,那么您可以将generic constraint 应用于您的ConvertListToDataTable&lt;T&gt; 类;这将允许编译器预先知道某些属性在基础级别上可用于该类型。

但是如果您想允许T 是任何类型,那么@MrFox 是正确的,因为您需要使用反射来查看该类型在运行时具有的属性并以这种方式填充您的DataTable

【讨论】:

    【解决方案2】:

    反射可以解决这个问题:

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

    【讨论】:

      猜你喜欢
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2012-07-30
      相关资源
      最近更新 更多