Necesito crear un tipo solo a partir de su nombre completo Ej: "System.String" o "Tuple'2 [string, Mytype]". no hay información sobre el ensamblado en la cadena. Aquí se muestra el código.Cargando un tipo genérico por nombre cuando los argumentos genéricos provienen de ensamblados múltiples
private static Type LoadType(string typeName)
{
// try loading the type
Type type = Type.GetType(typeName, false);
if (type != null)
return type;
// if the loading was not successfull iterate all the referenced assemblies and try to load the type.
Assembly asm = Assembly.GetEntryAssembly();
AssemblyName[] referencedAssemblies = asm.GetReferencedAssemblies();
foreach (AssemblyName referencedAssemblyName in referencedAssemblies)
{
type = referencedAssembly.GetType(typeName, false);
if (type != null)
return type;
}
throw new TypeLoadException(string.Format("Could not load the Type '{0}'",typeName));
}
este método funciona cuando el tipo no es genérico. Pero para los tipos genéricos, la iteración a través de los ensamblados siempre falla porque ningún ensamblaje contiene todas las definiciones necesarias para construir el tipo.
¿Hay alguna forma de proporcionar conjuntos múltiples para la resolución de tipo al llamar a GetTypes?
si está ejecutando programáticamente los nombres de tipos y modificando el nombre del tipo genérico que se creará, para una lista, por ejemplo, asegúrese de usar AssemblyQualifiedName. –
¿Qué vas a hacer con el caso donde hay dos tipos en dos referencias diferentes que tienen exactamente el mismo nombre? –
todos los tipos tienen un prefijo con su espacio de nombres, así que con suerte esto no sucederá a menudo, la posterior deserialización fallará. Puedo retroceder y probar otro tipo en otro ensamblaje y volver a intentar la deserialización. Pero sé que es más fácil decirlo que hacerlo. –