ホームページ >バックエンド開発 >C++ >文字列の型パラメーターを使用して、一般的なクラスをインスタンス化できますか?

文字列の型パラメーターを使用して、一般的なクラスをインスタンス化できますか?

DDD
DDDオリジナル
2025-02-01 12:26:14113ブラウズ

Can I Instantiate a Generic Class with a Type Parameter from a String?

genericクラスの型パラメーターとしてインスタンス化されたシステムを渡します

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

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

ここで、mygenericclassは

public class MyGenericClass<T>

として定義されます。エラーでコンパイルが失敗します "'タイプまたは名前空間' mytype ''見つけることができませんでした」。これを克服するために、反射を活用できます。以下は完全に機能的な例です。

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

以上が文字列の型パラメーターを使用して、一般的なクラスをインスタンス化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。