2

我有一个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并围绕铸件工作,看起来比我目前拥有的更好,但听起来还是太笨重了。

4

1 回答 1

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();
}
于 2012-10-11T21:32:26.597 回答