2012-08-16 15 views
9

Estas son preguntas similares: How-to: Load a type from a referenced assembly at runtime using a string in Silverlight, GetType on a class in a referenced assembly fails pero ninguna respuesta funciona.Obtener el tipo de ensamblado al que se hace referencia proporcionando el nombre de clase como cadena?

Tengo un proyecto MVC que extrae datos de una base de datos que incluye los tipos simples como cadenas. Estos tipos se encuentran en un conjunto referenciado, no en el proyecto MVC.

Así, por ejemplo, digamos que mi nombre ensamblaje de referencia es MyFramework y el nombre de letra normal Car, el nombre de tipo completo podría ser MyFramework.Cars.Car o MyFramework.Vehicles.Cars.Car o alguna otra variación. Todo lo que tengo son el nombre del ensamblado al que se hace referencia y el nombre de clase simple como cadenas. ¿Cómo puedo obtener el tipo independientemente del nombre de tipo completo?

Finalmente, ¿podría escribir una función en el ensamblado al que se hace referencia que llama a GetType() y usar eso en el proyecto MvC para poder renunciar a incluir el nombre del ensamblado? Quiero eliminar conocer el nombre de ensamblado así que pensé que podría escribir un Util en el ensamblaje de referencia como:

namespace MyFramework //the referenced assembly 
{ 
    public static class TypeUtil 
    { 
    public static Type GetFrameworkType(string typeName) 
    { 
     return Type.GetType(typeName); 
    } 
    } 
} 

Y luego, en mi proyecto MVC pude llamarlo sin necesidad de la asamblea como un nombre de cadena. ¿Es posible o necesitaré siempre el nombre del ensamblado?

+0

¿Por qué las otras respuestas no funcionaron? –

+0

@RobertHarvey Es porque solo tengo el nombre de clase simple. No es el nombre de tipo completo. Esas respuestas se basan en conocer el tipo completo. – SventoryMang

Respuesta

19

Quizás el ensamblaje al que se hace referencia no esté cargado en ese momento. Además, entiendo por su pregunta que no tiene el nombre completo, solo el nombre de la clase.
usted debe tratar de algo a lo largo de esta línea a continuación:

Type type = Assembly.Load("YourAssemblyName").GetTypes().First(t => t.Name == "ShortTypeName"); 

Esperanza le he entendido bien.

+0

Si escribo un Util en ese ensamblaje pero todavía solo tengo el nombre de clase, ¿cómo se vería? Me gustaría eliminar la necesidad del nombre del ensamblado escribiendo una clase 'TypeUtil' que pueda tener una función' GetTypeFromFramework (string typeName) '. Pensé que si llamo a 'GetType' en ese ensamblado, no necesito usar el ensamblaje en absoluto, pero todavía devuelve nulo. – SventoryMang

+0

Por favor, publique una muestra de lo que está tratando de hacer, para que podamos entender mejor su situación. –

+0

Edité la pregunta. Tu respuesta funciona cuando la utilizo en mi Util. Solo tengo curiosidad si puedo eliminar la dependencia del nombre del ensamblado como una cadena. Tenía la impresión de que si llamaba a GetType() en ese ensamblado, no necesitaría proporcionar el nombre del ensamblado, sino simplemente el suministro de 'Type.GetType (class name)' devolvía nulo, incluso cuando este código estaba en el montaje referenciado – SventoryMang

9

Por primera pregunta, usted podría hacer algo como

Type t = AppDomain.CurrentDomain.GetAssemblies() 
           .Where(a => a.FullName == "MyFramework") 
           .SelectMany(a => a.GetTypes()) 
           .Where(t => t.Name == "Car") 
           .FirstOrDefault(); 

No estoy seguro de lo que entendemos por la segunda pregunta.

Cuestiones relacionadas