我相信您想要的是:
public static object ConvertList(List<object> value, Type type)
{
var containedType = type.GenericTypeArguments.First();
return value.Select(item => Convert.ChangeType(item, containedType)).ToList();
}
使用示例:
var objects = new List<Object> { 1, 2, 3, 4 };
ConvertList(objects, typeof(List<int>)).Dump();
我不确定这有多有用......我猜它强调了非常有用的Convert.ChangeType方法!
更新:由于其他人已经正确指出,这实际上并没有返回一个List<T>
(其中T是所需的类型),因此可能不能完全回答问题,我选择提供一个更现代化的答案:
public static object ConvertList(List<object> items, Type type, bool performConversion = false)
{
var containedType = type.GenericTypeArguments.First();
var enumerableType = typeof(System.Linq.Enumerable);
var castMethod = enumerableType.GetMethod(nameof(System.Linq.Enumerable.Cast)).MakeGenericMethod(containedType);
var toListMethod = enumerableType.GetMethod(nameof(System.Linq.Enumerable.ToList)).MakeGenericMethod(containedType);
IEnumerable<object> itemsToCast;
if(performConversion)
{
itemsToCast = items.Select(item => Convert.ChangeType(item, containedType));
}
else
{
itemsToCast = items;
}
var castedItems = castMethod.Invoke(null, new[] { itemsToCast });
return toListMethod.Invoke(null, new[] { castedItems });
}
如果您不需要转换(因此每个值的类型实际上是正确的,而且您没有字符串中的int等),那么请删除
performConversion
标志及其关联块。
示例:
https://dotnetfiddle.net/nSFq22
List<object>
。请参见:https://dotnetfiddle.net/Hd4y1c - Olivernameof(Enumerable.Cast)
和nameof(Enumerable.ToList)
。 - Oliver