1. ホーム
  2. c#

[解決済み】インスタンス化されたSystem.Typeをジェネリッククラスの型パラメータとして渡す。

2022-04-14 10:55:30

質問

タイトルがなんだかよくわからない。知りたいのは、こんなことが可能なのか、ということです。

string typeName = <read type name from somwhere>;
Type myType = Type.GetType(typeName);

MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>();

明らかに、MyGenericClassは、次のように記述されています。

public class MyGenericClass<T>

今現在、コンパイラは「The type or namespace 'myType' could not be found."」と文句を言っていますが、これを実行する方法があるはずです。

解決方法は?

リフレクションがないとできない。しかし、あなたは できる リフレクションを使えばいいんです。以下は完全な例です。

using System;
using System.Reflection;

public class Generic<T>
{
    public Generic()
    {
        Console.WriteLine("T={0}", typeof(T));
    }
}

class Test
{
    static void Main()
    {
        string typeName = "System.String";
        Type typeArgument = Type.GetType(typeName);

        Type genericClass = typeof(Generic<>);
        // MakeGenericType is badly named
        Type constructedClass = genericClass.MakeGenericType(typeArgument);

        object created = Activator.CreateInstance(constructedClass);
    }
}

注意:ジェネリッククラスが複数の型を受け入れる場合、型名を省略するときなどにはカンマを入れる必要があります。

Type genericClass = typeof(IReadOnlyDictionary<,>);
Type constructedClass = genericClass.MakeGenericType(typeArgument1, typeArgument2);