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 に答える