Convertir cadena para escribir C #

Si recibo una cadena que contiene el nombre de una clase y quiero convertir esta cadena a un tipo real (el de la cadena), ¿cómo puedo hacer esto?

Lo intenté

Type.GetType("System.Int32") 

por ejemplo, parece funcionar.

Pero cuando bash con mi propio objeto, siempre devuelve nulo …

No tengo idea de lo que habrá en la cadena de antemano, así que es mi única fuente para convertirla en su tipo real.

 Type.GetType("NameSpace.MyClasse"); 

¿Alguna idea?

Solo puede usar el nombre del tipo (con su espacio de nombres, por supuesto) si el tipo está en mscorlib o en el ensamblado que realiza la llamada. De lo contrario, también debe incluir el nombre del ensamblado:

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

Si el ensamblado tiene un nombre fuerte, debe incluir toda esa información también. Consulte la documentación de Type.GetType(string) para obtener más información.

Alternativamente, si ya tiene una referencia al ensamblaje (por ejemplo, a través de un tipo conocido), puede usar Assembly.GetType :

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

Tratar:

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

Jon Skeet tiene razón, como siempre 🙂

Actualización: puede especificar el ensamblaje que contiene el tipo de destino de varias maneras, como mencionó Jon, o:

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

Si realmente desea obtener el tipo por nombre, puede usar lo siguiente:

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

Tenga en cuenta que puede mejorar el rendimiento de esto drásticamente cuanto más información tenga sobre el tipo que está intentando cargar.

utilice el siguiente método LoadType para usar System.Reflection para cargar todos los ensamblados registrados ( GAC ) y referenciados, y verifique para typeName

 public Type[] LoadType(string typeName) { return LoadType(typeName, true); } public Type[] LoadType(string typeName, bool referenced) { return LoadType(typeName, referenced, true); } private Type[] LoadType(string typeName, bool referenced, bool gac) { //check for problematic work if (string.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 string gacPath = Environment.GetFolderPath(System.Environment.SpecialFolder.Windows) + "\\assembly"; var files = GetGlobalAssemblyCacheFiles(gacPath); foreach (string 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 string[] GetGlobalAssemblyCacheFiles(string 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(); }