2013-10-07 33 views
1

如何以更一般的方式将原始列表转换为另一个列表。目标类型只在运行时才知道。预定类型列表的对象列表

我尝试了以下,但我得到了一个List<object>充满了DestinationType类型的元素。

public static object ToList(List<object> original,Type destinationType) 
    { 
     return 
      original 
       .Select(v => Convert.ChangeType(v, destinationType, CultureInfo.InvariantCulture)) 
       .ToList();//List<object> is returned, I want a List<destinationType> 
    } 

回答

2

试试这个:

var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(destinationType)); 

foreach (var element in original) 
{ 
    var converted = Convert.ChangeType(element, destinationType, CultureInfo.InvariantCulture); 
    list.Add(converted); 
} 

return list; 

代码在运行时创建的List<destinationType>实例,然后将所有转换元素,它并返回。

2

如果你可以使这个方法是通用的,这是最好的解决方案。

public static object ToList<T>(List<object> original) 
    { 
     var type = typeof(T); 
     return original 
        .Select(v => (T)Convert.ChangeType(v, type, CultureInfo.InvariantCulture)) 
        .ToList(); 
    } 

否则,你同@拉法尔的解决方案..

+0

我不能使该方法一般,我没有权的T直到运行时 – Toto

+0

然后你可以去@rafal的回答。它是正确的 –