Pergunta

Na Net, dado um nome do tipo, existe um método que me diz em que a montagem (instância de System.Reflection.Assembly) que tipo é definido?

Eu assumo que meu projeto já tem uma referência a essa montagem, só precisa saber qual é.

Foi útil?

Solução

Assembly.GetAssembly assume que você tem uma instância do tipo e Type.GetType assume que tem o nome de tipo totalmente qualificado que inclui a montagem nome.

Se você tiver apenas o nome do tipo base, você precisa fazer algo mais parecido com isto:

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";
}

Isso também assume que o seu tipo é declarado na raiz. Você precisará fornecer o espaço de nomes ou tipos encerram no nome, ou iterate da mesma maneira.

Outras dicas

Assembly.GetAssembly(typeof(System.Int32))

Substituir System.Int32 com qualquer tipo acontecer de você necessidade. Porque ele aceita um parâmetro Type, você pode fazer praticamente qualquer coisa desta forma, por exemplo:

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

Eu adaptei a resposta aceita pelos meus próprios fins (retornando o objeto de montagem em vez do nome do assembly) e reformulado o código para VB.NET e 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

Eu só estou compartilhando-lo aqui se alguém gostaria de uma solução LINQy para a resposta aceita.

Type.GetType(typeNameString).Assembly

Se você pode usá-lo, esta sintaxe é o mais curto / mais limpo:

typeof(int).Assembly
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top