Maison > développement back-end > C++ > Les classes génériques peuvent-elles être instanciées avec des paramètres de type déterminés d'exécution?

Les classes génériques peuvent-elles être instanciées avec des paramètres de type déterminés d'exécution?

DDD
Libérer: 2025-02-01 12:31:10
original
750 Les gens l'ont consulté

Can Generic Classes Be Instantiated with Runtime-Determined Type Parameters?

Instanciation d'exécution des classes génériques

Cet article explore le défi d'instanciation d'une classe générique avec un paramètre de type déterminé à l'exécution. L'utilisation directe d'une variable déterminée Type d'exécution comme paramètre de type générique est impossible en raison des contraintes de temps de compilation. Le compilateur a besoin du type de béton au moment de la compilation.

Tenter cela directement, comme indiqué ci-dessous, se traduit par une erreur du compilateur:

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

MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error
Copier après la connexion

La solution consiste à tirer parti de la réflexion. L'exemple suivant le démontre:

using System;
using System.Reflection;

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

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

        Type genericClass = typeof(Generic<>); // Note the <> here
        Type constructedClass = genericClass.MakeGenericType(typeArgument);

        object created = Activator.CreateInstance(constructedClass);
    }
}
Copier après la connexion

L'étape cruciale consiste à utiliser Type.MakeGenericType(). Cette méthode crée dynamiquement un nouveau type représentant une instance générique de Generic<T>, substituant T avec le runtime typeArgument. Activator.CreateInstance() Instancie ensuite ce type nouvellement construit. Notez l'utilisation de Generic<> pour spécifier le type générique ouvert.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal