3
我想寫一個函數,它需要一個List<Object>
並將原始列表轉換爲指定對象類型列表List<ObjectType>
,知道對象原始列表中的類型爲ObjectType
。訣竅是,ObjectType
可以是任何類型,我發現使用反射。對於缺乏代碼抱歉,但我沒有理解我甚至可能會這樣做。如何將一種類型的通用列表轉換爲未知類型的通用列表
我想寫一個函數,它需要一個List<Object>
並將原始列表轉換爲指定對象類型列表List<ObjectType>
,知道對象原始列表中的類型爲ObjectType
。訣竅是,ObjectType
可以是任何類型,我發現使用反射。對於缺乏代碼抱歉,但我沒有理解我甚至可能會這樣做。如何將一種類型的通用列表轉換爲未知類型的通用列表
如果您知道,在列表中的每個產品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>
當然,你失去任何編譯時類型安全使用此方法。
爲什麼不只是'return items.Cast().ToList();'? –
2013-07-20 05:24:28
@bmused只有當所有對象都是'T'類型時纔有效。它基本上是一個箱子/取消箱子。在我使用整數作爲輸入的例子中,'.Cast'和'.Cast '會失敗。 –
如果僅在運行時才知道類型,則上述方法不起作用 – BrokenGlass