2013-07-20 95 views

回答

8

如果您知道,在列表中的每個產品ObjectType類型的,你可以這樣做:

List<object> sourceList = new List<object>() { 1, 2, 3 }; 
List<int> resultList = sourceList.Cast<int>().ToList(); 

如果你真的想每個項目轉換列表中的一個通用的方法,最簡單的方法是做這樣的事情:

public static IEnumerable<T> ConvertTo<T>(this IEnumerable items) 
{ 
    return items.Cast<object>().Select(x => (T)Convert.ChangeType(x, typeof(T))); 
} 

這將被實現爲一個擴展方法,所以你可以寫:

List<object> sourceList = new List<object>() { 1, 2, 3 }; 
List<string> resultList = sourceList.ConvertTo<string>().ToList(); 

如果在編譯時不知道目標類型,則確實需要使用反射。像這樣的東西會工作:

class ListUtil 
{ 
    public static List<T> ConvertToList<T>(this IEnumerable items) 
    { 
     // see method above 
     return items.ConvertTo<T>().ToList(); 
    } 

    public static IList ConvertToList(this IEnumerable items, Type targetType) 
    { 
     var method = typeof(ListUtil).GetMethod(
      "ConvertToList", 
      new[] { typeof(IEnumerable) }); 
     var generic = method.MakeGenericMethod(targetType); 
     return (IList)generic.Invoke(null, new[] { items }); 
    } 
} 

現在你可以這樣調用它:

List<object> sourceList = new List<object>() { 1, 2, 3 }; 
IList resultList = ListUtil.ConvertToList(sourceList, typeof(string)); 
resultList.GetType(); // List<string> 

當然,你失去任何編譯時類型安全使用此方法。

+0

爲什麼不只是'return items.Cast ().ToList();'? – 2013-07-20 05:24:28

+0

@bmused只有當所有對象都是'T'類型時纔有效。它基本上是一個箱子/取消箱子。在我使用整數作爲輸入的例子中,'.Cast '和'.Cast '會失敗。 –

+2

如果僅在運行時才知道類型,則上述方法不起作用 – BrokenGlass

相關問題