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!