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:
<code class="language-csharp">string typeName = "<read type name somewhere>"; // Runtime type name Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error</code>
La solution consiste à tirer parti de la réflexion. L'exemple suivant le démontre:
<code class="language-csharp">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); } }</code>
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!