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
DDDoriginal
2025-02-01 12:26:14188parcourir

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

où MyGenericClass est défini comme

public class MyGenericClass<T>

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

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

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:
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