Convertir la chaîne en type en C #

Si je reçois une chaîne contenant le nom d’une classe et que je souhaite convertir cette chaîne en un type réel (celui de la chaîne), comment puis-je procéder?

j’ai essayé

Type.GetType("System.Int32") 

Par exemple, il semble fonctionner.

Mais quand j’essaie avec mon propre object, il renvoie toujours null …

Je n’ai aucune idée de ce qui se trouvera dans la chaîne à l’avance, c’est donc ma seule source pour la convertir à son type réel.

 Type.GetType("NameSpace.MyClasse"); 

Une idée?

Vous ne pouvez utiliser que le nom du type (avec son espace de nommage, bien sûr) si le type est dans mscorlib ou l’assembly appelant. Sinon, vous devez également inclure le nom de l’assemblée:

 Type type = Type.GetType("Namespace.MyClass, MyAssembly"); 

Si l’assembly est fortement nommé, vous devez également inclure toutes ces informations. Consultez la documentation de Type.GetType(ssortingng) pour plus d’informations.

Si vous avez déjà une référence à l’assembly (par exemple, via un type connu), vous pouvez utiliser Assembly.GetType :

 Assembly asm = typeof(SomeKnownType).Assembly; Type type = asm.GetType(namespaceQualifiedTypeName); 

Essayer:

 Type type = Type.GetType(inputSsortingng); //target type object o = Activator.CreateInstance(type); // an instance of target type YourType your = (YourType)o; 

Jon Skeet a raison comme d’habitude 🙂

Mise à jour: vous pouvez spécifier l’assembly contenant le type de cible de différentes manières, comme Jon l’a mentionné, ou:

 YourType your = (YourType)Activator.CreateInstance("AssemblyName", "NameSpace.MyClass"); 

Si vous voulez vraiment obtenir le type par son nom, vous pouvez utiliser ce qui suit:

 System.AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).First(x => x.Name == "theassembly"); 

Notez que vous pouvez améliorer les performances de manière drastique à mesure que vous avez plus d’informations sur le type que vous essayez de charger.

utiliser la méthode LoadType suivante pour utiliser System.Reflection pour charger tous les assemblys enregistrés ( GAC ) et référencés et vérifier le typeName

 public Type[] LoadType(ssortingng typeName) { return LoadType(typeName, true); } public Type[] LoadType(ssortingng typeName, bool referenced) { return LoadType(typeName, referenced, true); } private Type[] LoadType(ssortingng typeName, bool referenced, bool gac) { //check for problematic work if (ssortingng.IsNullOrEmpty(typeName) || !referenced && !gac) return new Type[] { }; Assembly currentAssembly = Assembly.GetExecutingAssembly(); List assemblyFullnames = new List(); List types = new List(); if (referenced) { //Check refrenced assemblies foreach (AssemblyName assemblyName in currentAssembly.GetReferencedAssemblies()) { //Load method resolve refrenced loaded assembly Assembly assembly = Assembly.Load(assemblyName.FullName); //Check if type is exists in assembly var type = assembly.GetType(typeName, false, true); if (type != null && !assemblyFullnames.Contains(assembly.FullName)) { types.Add(type); assemblyFullnames.Add(assembly.FullName); } } } if (gac) { //GAC files ssortingng gacPath = Environment.GetFolderPath(System.Environment.SpecialFolder.Windows) + "\\assembly"; var files = GetGlobalAssemblyCacheFiles(gacPath); foreach (ssortingng file in files) { try { //reflection only Assembly assembly = Assembly.ReflectionOnlyLoadFrom(file); //Check if type is exists in assembly var type = assembly.GetType(typeName, false, true); if (type != null && !assemblyFullnames.Contains(assembly.FullName)) { types.Add(type); assemblyFullnames.Add(assembly.FullName); } } catch { //your custom handling } } } return types.ToArray(); } public static ssortingng[] GetGlobalAssemblyCacheFiles(ssortingng path) { List files = new List(); DirectoryInfo di = new DirectoryInfo(path); foreach (FileInfo fi in di.GetFiles("*.dll")) { files.Add(fi.FullName); } foreach (DirectoryInfo diChild in di.GetDirectories()) { var files2 = GetGlobalAssemblyCacheFiles(diChild.FullName); files.AddRange(files2); } return files.ToArray(); }