如何从 C# 中的通用 List<T> 中获取元素? [复制]

Posted

技术标签:

【中文标题】如何从 C# 中的通用 List<T> 中获取元素? [复制]【英文标题】:How to get the elements from a generic List<T> in C#? [duplicate] 【发布时间】: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'

【问题讨论】:

现在我明白了.. 我搜索并没有找到。我希望解决方案对我有好处。谢谢 【参考方案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 方法参数。

【讨论】:

以上是关于如何从 C# 中的通用 List<T> 中获取元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的 List<T> 中选择 N 个随机元素

从 C# 中的 List<T> 中选择 N 个随机元素的算法[重复]

如何在 C# 中将 IEnumerable<T> 转换为 List<T>?

如何从 C# 中的同一方法返回字符串以及 IEnumerable<T>? [复制]

C#从反射类型实例化通用列表[重复]

C# 从 List<T> 中选择存在于另一个列表中的所有元素