类型转换,运行时的替代铸铁 ?(Type casting, a runtime alterna

2019-09-24 00:01发布

我有一个IList<object>其中每一个对象是一个类型的一个实例T (我不知道在编译时间)。

我需要IList<T>出于此。 我不能用演员,因为我不知道在编译时的类型,并没有一个演员(类型)的过载,我可以使用。

这是我目前有到位:

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 ,只是周围的铸造工作,似乎比我现在有更好,但它仍然听起来太笨重。

Answer 1:

如果你真的需要做的正是如你所说,我会先分开了这一点,为“上下文特定的代码”和“可重用代码”。 有效地你想是这样的:

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();
}


文章来源: Type casting, a runtime alternative to Cast?