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.
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.
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 :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
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:
Type myClassType = Type.GetType("TypeName,DllName");
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:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
A segunda sequência após a vírgula é o nome de referência (nome da DLL).
NamespaceTypeName, AssemblyNameSpec
onde AssemblyNameSpec
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 exemplo Version
, Culture
PublicKeyToken
). Felizmente, as propriedades são opcionais .
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
tente usar esse método
public static Type GetType(string typeName)
{
var type = Type.GetType(typeName);
if (type != null) return type;
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
type = a.GetType(typeName);
if (type != null)
return type;
}
return null ;
}
AppDomain
não é suportado. Não tenho certeza de quaisquer alternativas.
Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
lock (typeCache) {
if (!typeCache.TryGetValue(typeName, out t)) {
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
t = a.GetType(typeName);
if (t != null)
break;
}
typeCache[typeName] = t; // perhaps null
}
}
return t != null;
}
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:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
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
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
e então você pode obter o tipo com qualificadoName
Type elementType = Type.GetType(qualifiedName);
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 dizendo
EDIT: 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 ...)
+
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 ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Portanto, agora é possível usar o valor retornado em strType para criar uma instância desse objeto.
Como Type.GetType (String) precisa do Type.AssemblyQualifiedName, você deve usar Assembly.CreateQualifiedName (String, String) .
string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);
A Version, Culture e PublicKeyToken não são necessárias, por assemblyName
isso é possível usar MyAssembly.GetName (). Name.
Sobre Type.GetType (String) :
Se o tipo estiver no assembly atualmente em execução ou no Mscorlib.dll, será suficiente fornecer o nome do tipo qualificado pelo seu espaço para nome.
Se a montagem for referenciada e a classe visível:
typeof(namespace.a.b.ClassName)
GetType retorna nulo porque o tipo não foi encontrado, com typeof, o compilador pode ajudá-lo a descobrir o erro.
Tente usar o nome completo do tipo que inclui as informações da montagem, por exemplo:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
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.
Para mim, um "+" era a chave! Esta é a minha classe (é aninhada):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
e esta linha de código funcionou:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Essa solução acima parece ser a melhor para mim, mas não funcionou para mim; portanto, fiz o seguinte:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
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 AssemblyQualifiedNames
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.