Este código:
Type.GetType("namespace.a.b.ClassName")
retorna null
.
e eu tenho os usos:
using namespace.a.b;
Atualizar:
O tipo existe, está em uma biblioteca de classes diferente e eu preciso obtê-lo pelo nome da string.
c#
reflection
Omu
fonte
fonte
Respostas:
Type.GetType("namespace.qualified.TypeName")
só funciona quando o tipo é encontrado no mscorlib.dll ou no assembly atualmente em execução.Se nenhuma dessas coisas for verdadeira, você precisará de um nome qualificado para montagem :
fonte
Assembly a = Assembly.Load("SomeLibrary");
- e depois carregar o tipo por nome da montagem -Type t = a.GetType("namespace.a.b.ClassName");
.typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
pode poupar algum aborrecimento, eventualmente,Você também pode obter o tipo sem nome qualificado de montagem, mas também com o nome da dll, por exemplo:
Eu tive a mesma situação e funcionou para mim. Eu precisava de um objeto do tipo "DataModel.QueueObject" e tinha uma referência a "DataModel", então obtive o tipo da seguinte maneira:
A segunda sequência após a vírgula é o nome de referência (nome da DLL).
fonte
NamespaceTypeName, AssemblyNameSpec
ondeAssemblyNameSpec
está o identificador da montagem sem nenhuma propriedade. Mesmo que essa resposta seja essencialmente a mesma que a aceita, presumo que algumas pessoas prefiram isso porque elimina parte do "ruído" que as propriedades da montagem introduzem (por exemploVersion
,Culture
PublicKeyToken
). Felizmente, as propriedades são opcionais .AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
tente usar esse método
fonte
AppDomain
não é suportado. Não tenho certeza de quaisquer alternativas.fonte
T
do tipo genérico é removido.Se o assembly fizer parte da compilação de um aplicativo ASP.NET, você poderá usar a classe BuildManager:
fonte
se a sua classe não estiver na área atual, você deve fornecer o nome qualificado e este código mostra como obter o nome qualificado da classe
e então você pode obter o tipo com qualificadoName
fonte
Se for um tipo aninhado, você pode estar se esquecendo de transformar a. para um +
Independentemente disso,
typeof( T).FullName
dirá o que você deveria estar dizendoEDIT: BTW, os usos (como eu tenho certeza que você sabe) são apenas diretrizes para o compilador em tempo de compilação e, portanto, não podem ter nenhum impacto no sucesso da chamada da API. (Se você tivesse referências de projeto ou montagem, isso poderia ter tido influência - portanto, as informações não são inúteis, são necessárias algumas filtragem ...)
fonte
+
separador)Estou abrindo controles de usuário, dependendo de quais controles o usuário tem acesso especificado em um banco de dados. Então, eu usei esse método para obter o TypeName ...
Portanto, agora é possível usar o valor retornado em strType para criar uma instância desse objeto.
fonte
Quando tenho apenas o nome da classe, uso este:
fonte
Como Type.GetType (String) precisa do Type.AssemblyQualifiedName, você deve usar Assembly.CreateQualifiedName (String, String) .
A Version, Culture e PublicKeyToken não são necessárias, por
assemblyName
isso é possível usar MyAssembly.GetName (). Name.Sobre Type.GetType (String) :
fonte
Se a montagem for referenciada e a classe visível:
GetType retorna nulo porque o tipo não foi encontrado, com typeof, o compilador pode ajudá-lo a descobrir o erro.
fonte
Tente usar o nome completo do tipo que inclui as informações da montagem, por exemplo:
Eu tive a mesma situação quando estava usando apenas o namesspace.classname para obter o tipo de uma classe em um assembly diferente e não funcionou. Só funcionou quando incluí as informações de montagem na minha string de tipo, como mostrado acima.
fonte
Verifique se a vírgula está diretamente após o nome completo
Como isso não vai funcionar
Fiquei perplexo por alguns dias neste
fonte
Para mim, um "+" era a chave! Esta é a minha classe (é aninhada):
e esta linha de código funcionou:
fonte
Essa solução acima parece ser a melhor para mim, mas não funcionou para mim; portanto, fiz o seguinte:
A pré-condição é que você saiba o caminho da montagem. No meu caso, eu sei porque é uma montagem criada a partir de outro projeto interno e incluída na pasta bin do nosso projeto.
Caso seja importante usar o Visual Studio 2013, meu .NET de destino é 4.0. Este é um projeto do ASP.NET, por isso estou obtendo um caminho absoluto
HttpContext
. No entanto, o caminho absoluto não é um requisito, como parece do MSDN no AssemblyQualifiedNamesfonte
Eu trapaceei. Como os tipos que eu quero criar (por nome) estão todos em uma dll que eu controle, bastai colocar um método estático na dll na montagem que usa um nome simples e chama type.GetType a partir desse contexto e retorna o resultado .
O objetivo original era que o tipo pudesse ser especificado pelo nome nos dados de configuração. Desde então, mudei o código para que o usuário especificasse um formato para processar. As classes de manipulador de formato implementam uma interface que determina se o tipo pode analisar o formato especificado. Em seguida, uso a reflexão para encontrar tipos que implementam a interface e encontrar um que lide com o formato. Portanto, agora a configuração especifica um nome de formato, um tipo não específico. O código de reflexão pode olhar para dlls adjacentes e carregar, para que eu tenha uma arquitetura de plug-in de um tipo pobre.
fonte