c# - textos - uso de la c s z ejercicios para niños
Convertir cadena para escribir C# (4)
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.
Esta pregunta ya tiene una respuesta aquí:
- Type.GetType ("namespace.abClassName") devuelve null 16 respuestas
Si recibo una cadena que contiene el nombre de una clase (objeto) 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 intento 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");
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<string> assemblyFullnames = new List<string>();
List<Type> types = new List<Type>();
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<string> files = new List<string>();
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();
}