Maison > développement back-end > C++ > Puis-je instancier une classe générique avec un paramètre de type à partir d'une chaîne?

Puis-je instancier une classe générique avec un paramètre de type à partir d'une chaîne?

DDD
Libérer: 2025-02-01 12:26:14
original
187 Les gens l'ont consulté

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

passez un système instancié.Type en tant que paramètre de type pour une classe générique

Il est souhaité de savoir s'il est possible d'instancier un classe générique avec un paramètre de type spécifique obtenu à partir d'une représentation de chaîne du nom de type. En d'autres termes, peut-on construire le scénario suivant:

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

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

où MyGenericClass est défini comme

public class MyGenericClass<T>
Copier après la connexion

La compilation échouera avec l'erreur "'Le type ou l'espace de noms' myType ' Impossible de trouver "". Pour surmonter cela, la réflexion peut être exploitée. Vous trouverez ci-dessous un exemple entièrement fonctionnel:

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);
    }
}
Copier après la connexion

Alternativement, si la classe générique accepte plusieurs paramètres de type, il est crucial de spécifier les virgules lors de l'omission des noms de type. Par exemple:

Type genericClass = typeof(IReadOnlyDictionary<,>);
Type constructedClass = genericClass.MakeGenericType(typeArgument1, typeArgument2);
Copier après la connexion

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