1

ジェネリックと型引数を混在させることはできますか? たとえば、次のようなコードを記述する方法はありますか。

IList GetListOfListsOfTypes(Type[] types)
{
    IList<IList> listOfLists = new List<IList>();

    foreach (Type t in types)
    {
        listOfLists.Add(new List<t>());
    }

    return listOfLists.ToList();
}

明らかに、コンパイラはこれを好まないのですが、これを達成する方法はありますか?

4

1 に答える 1

4

リフレクションでこれを行うには、オープン型からクローズ ジェネリック型を構築する必要があります。次に、リフレクションでそのために持っているオプションの1つでそれを構築します。Activator.CreateInstance はそのためにうまく機能します。

IList GetListOfListsOfTypes(Type[] types)
{
    IList<IList> listOfLists = new List<IList>();

    foreach (Type t in types)
    {
        Type requestedTypeDefinition = typeof(List<>);
        Type genericType = requestedTypeDefinition.MakeGenericType(t);
        IList newList = (IList)Activator.CreateInstance(genericType);
        listOfLists.Add(newList);
    }

    return listOfLists;
}

このメソッドから非ジェネリック s のリストを返すことに注意してくださいIList。これは、コンパイル時に型がわからないため必要です。そのため、新しいジェネリック リストを使用するには、おそらくリフレクションを再度使用する必要があります。 . それが価値があるかどうかを検討してください - もちろん、それはあなたの要件に依存します.

于 2013-10-16T20:59:27.713 に答える