Pregunta

En .Net, dado un nombre del tipo, ¿existe un método que me dice en la que el montaje (instancia de System.Reflection.Assembly) se define que tipo?

Asumo que mi proyecto ya cuenta con una referencia a esa asamblea, sólo hay que saber cuál es.

¿Fue útil?

Solución

Assembly.GetAssembly asume que tiene una instancia del tipo y Type.GetType asume que tiene el nombre de tipo completo que incluye nombre de ensamblado.

Si sólo tiene el nombre del tipo de base, que tiene que hacer algo más parecido a esto:

public static String GetAssemblyNameContainingType(String typeName) 
{
    foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
    {
        Type t = currentassembly.GetType(typeName, false, true);
        if (t != null) {return currentassembly.FullName;}
    }

    return "not found";
}

Esto también supone que su tipo se declara de la raíz. Lo que se necesita para proporcionar el espacio de nombres o tipos de cerramiento en el nombre, o una iteración de la misma manera.

Otros consejos

Assembly.GetAssembly(typeof(System.Int32))

Reemplazar System.Int32 con cualquier tipo en que necesite. Ya que acepta un parámetro Type, se puede hacer casi cualquier cosa de esta manera, por ejemplo:

string GetAssemblyLocationOfObject(object o) {
    return Assembly.GetAssembly(o.GetType()).Location;
}

He adaptado la respuesta aceptada para mis propios fines (volviendo al objeto de montaje en lugar del nombre de ensamblado), y refactorizado el código para VB.NET y LINQ:

Public Function GetAssemblyForType(typeName As String) As Assembly
    Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing)
End Function

Sólo estoy compartiendo aquí si alguien más desea una solución LINQy a la respuesta aceptada.

Type.GetType(typeNameString).Assembly

Si se puede usar, esta sintaxis es la más corta / más limpio:

typeof(int).Assembly
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top