我有一个IList<object>
,其中每个对象都是T
类型的实例(在编译时我不知道)。
我需要一个IList<T>
。我不能使用Cast,因为我在编译时不知道类型,并且没有我可以使用的Cast(Type)重载。
这就是我目前所拥有的:
private object Map(IList<ApiCallContext> bulk)
{
// god-awful way to build a IEnumerable<modelType> list out of Enumerable<object> where object is modelType.
// quoting lead: "think whatever you do it will be ugly"
Type modelType = model.Method.ModelType;
if (bulk.Count > 0)
{
modelType = bulk.First().Parameters.GetType();
}
Type listType = typeof(List<>).MakeGenericType(modelType);
object list = Activator.CreateInstance(listType);
foreach (object value in bulk.Select(r => r.Parameters))
{
((IList)list).Add(value);
}
return list;
}
我正在考虑的是,也许我可以创建一个新的LooseList
类来实现IList
并且只是在演员周围工作,看起来比我现在的要好,但它仍然听起来太笨重了
答案 0 :(得分:4)
如果你真的需要按照你的说法完成,我首先将其分为“特定于上下文的代码”和“可重用代码”。实际上你想要这样的东西:
public static IList ToStrongList(this IEnumerable source, Type targetType)
我将通过写入强类型方法实现,然后通过反射调用它:
private static readonly MethodInfo ToStrongListMethod = typeof(...)
.GetMethod("ToStrongListImpl", BindingFlags.Static | BindingFlags.NonPublic);
public static IList ToStrongList(this IEnumerable source, Type targetType)
{
var method = ToStrongListMethod.MakeGenericMethod(targetType);
return (IList) method.Invoke(null, new object[] { source });
}
private static List<T> ToStrongListImpl<T>(this IEnumerable source)
{
return source.Cast<T>().ToList();
}