typeof
設計時のコードを使用すると、演算子を使用し、ジェネリック パラメーターに何らかの引数を与えることで、型を取得できます。
typeof(Singleton<SomeImplementationOfBaseObject>)
または
typeof(Singleton<>)
しかし、別の方法があります: リフレクションです。
Type singletonType = Type.GetType("NamespaceA.NamespaceN.Singleton`1");
1 の部分は、ジェネリック パラメーターの数です。あなたがそれのようなものを持っているなら、Class<T, S>
それは 2 などです。
リフレクションを使用すると、ジェネリック引数を指定する必要がないことに注意してください。とにかく、ジェネリック パラメーターを使用して型を取得できます。一般的な引数を指定するには、次のようにします。
Type genericType = singletonType.MakeGenericType(typeof(SomeImplementationOfBaseObject));
または、直接取得したい場合は、次のようにします。
Type singletonType = Type.GetType("NamespaceA.NamespaceN.Singleton`1[[NamespaceA.NamespaceN.SomeImplementationOfBaseObject]]");
[[ ]]
ジェネリック引数として渡された型のフル ネーム内の文字列。ジェネリック型が実行中のアセンブリと同じでない場合は、アセンブリ修飾名を指定する必要があることに注意してください (たとえば、 "NamespaceA.MyClass, MyAssembly" )。
アップデート
OPはコメントで次のように述べています。
public Singleton<BaseObject>[]
singletons; を使用すると、ジェネリック型またはメソッド「Singleton」でパラメーター「T」として使用するために、「エラー CS0309: The type BaseObject' must be convertible to Singleton」という警告が表示されます。
これは別の問題です。クラスで共分散を行うことはできません。そのようなことを行うには、次のようなインターフェースが必要です。
public interface ISingleton<out TBaseObject> where TBaseObject : .........
そして、Singleton<T>
クラスにそれを実装させます。
したがって、このような配列を次のように作成できます。
public ISingleton<BaseObject>[] singletons;
Covarianceを使用すると、ジェネリック パラメーターをアップキャストできます。これは、インターフェイスとデリゲートに限定されます。
詳細はこちら: