我想写一个接受 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>
当然,使用此方法会失去任何编译时类型安全性。
关于c# - 如何将一种类型的通用列表转换为未知类型的通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17758888/