Type.GetType Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Obtém um Type objeto que representa o tipo especificado.
Sobrecargas
| Nome | Description |
|---|---|
| GetType() |
Obtém o atual Type. |
| GetType(String) |
Obtém o Type nome especificado, executando uma pesquisa que diferencia maiúsculas de minúsculas. |
| GetType(String, Boolean) |
Obtém o Type nome especificado, executando uma pesquisa que diferencia maiúsculas de minúsculas e especificando se uma exceção será gerada se o tipo não for encontrado. |
| GetType(String, Boolean, Boolean) |
Obtém o Type nome com o nome especificado, especificando se uma exceção será gerada se o tipo não for encontrado e se deseja executar uma pesquisa que diferencia maiúsculas de minúsculas. |
| GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) |
Obtém o tipo com o nome especificado, opcionalmente fornecendo métodos personalizados para resolver o assembly e o tipo. |
| GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean) |
Obtém o tipo com o nome especificado, especificando se uma exceção será gerada se o tipo não for encontrado e, opcionalmente, fornecendo métodos personalizados para resolver o assembly e o tipo. |
| GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) |
Obtém o tipo com o nome especificado, especificando se uma pesquisa diferencia maiúsculas de minúsculas e se deseja gerar uma exceção se o tipo não for encontrado e, opcionalmente, fornecer métodos personalizados para resolver o assembly e o tipo. |
GetType()
- Origem:
- Type.cs
- Origem:
- Type.cs
- Origem:
- Type.cs
- Origem:
- Type.cs
- Origem:
- Type.cs
Obtém o atual Type.
public:
Type ^ GetType();
public:
virtual Type ^ GetType();
public Type GetType();
override this.GetType : unit -> Type
Public Function GetType () As Type
Retornos
O atual Type.
Implementações
Exceções
Um inicializador de classe é invocado e gera uma exceção.
Confira também
Aplica-se a
GetType(String)
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
Obtém o Type nome especificado, executando uma pesquisa que diferencia maiúsculas de minúsculas.
public:
static Type ^ GetType(System::String ^ typeName);
public static Type GetType(string typeName);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName);
public static Type? GetType(string typeName);
static member GetType : string -> Type
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string -> Type
Public Shared Function GetType (typeName As String) As Type
Parâmetros
- typeName
- String
O nome qualificado do assembly do tipo a ser obtido. Consulte AssemblyQualifiedName. Se o tipo estiver no assembly em execução no momento ou em mscorlib.dll/System.Private.CoreLib.dll, será suficiente fornecer o nome do tipo qualificado por seu namespace.
Retornos
O tipo com o nome especificado, se encontrado; caso contrário, null.
- Atributos
Exceções
typeName é null.
Um inicializador de classe é invocado e gera uma exceção.
typeName representa um tipo genérico que tem um tipo de ponteiro, um ByRef tipo ou Void como um de seus argumentos de tipo.
- ou -
typeName representa um tipo genérico que tem um número incorreto de argumentos de tipo.
- ou -
typeName representa um tipo genérico e um de seus argumentos de tipo não atende às restrições para o parâmetro de tipo correspondente.
typeName representa um tipo inválido, por exemplo, uma matriz de TypedReference.
O assembly ou uma de suas dependências foi encontrado, mas não pôde ser carregado.
Observação: em .NET para aplicativos da Windows Store ou a biblioteca de classes Portable, capture a exceção de classe base, IOException.
O assembly não é válido para o runtime carregado no momento.
Exemplos
O exemplo a seguir recupera o tipo e System.Int32 usa esse objeto de tipo para exibir a FullName propriedade de System.Int32.
using System;
class GetTypeExample
{
public static void Main()
{
try {
// Get the type of a specified class.
Type myType1 = Type.GetType("System.Int32");
Console.WriteLine("The full name is {0}.\n", myType1.FullName);
}
catch (TypeLoadException e)
{
Console.WriteLine("{0}: Unable to load type System.Int32", e.GetType().Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type myType2 = Type.GetType("NoneSuch", true);
Console.WriteLine("The full name is {0}.", myType2.FullName);
}
catch(TypeLoadException e) {
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name);
}
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
open System
try
// Get the type of a specified class.
let myType1 = Type.GetType "System.Int32"
printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type System.Int32"
try
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
let myType2 = Type.GetType("NoneSuch", true)
printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
Comentários
Você pode usar o GetType método para obter um Type objeto para um tipo em outro assembly se souber seu nome qualificado para assembly, que pode ser obtido de AssemblyQualifiedName.
GetType causa o carregamento do assembly especificado em typeName. Você também pode carregar um assembly usando o Assembly.Load método e, em seguida, usar o Assembly.GetType método ou Assembly.GetTypes para obter Type objetos. Se um tipo estiver em um assembly conhecido pelo programa em tempo de compilação, será mais eficiente usar typeof em C# ou o operador GetType no Visual Basic.
Note
Se typeName não for possível encontrar, a chamada para o GetType(String) método retornará null. Ele não gera uma exceção. Para controlar se uma exceção é gerada, chame uma sobrecarga do GetType método que tem um throwOnError parâmetro.
somente .NET Framework: GetType funciona apenas em assemblies carregados do disco. Se você chamar GetType para pesquisar um tipo definido em um assembly dinâmico definido usando os System.Reflection.Emit serviços, você poderá obter um comportamento inconsistente. O comportamento depende se o assembly dinâmico é persistente, ou seja, criado usando os RunAndSave modos ou Save de acesso da System.Reflection.Emit.AssemblyBuilderAccess enumeração. Se o assembly dinâmico for persistente e tiver sido gravado no disco antes GetType de ser chamado, o carregador encontrará o assembly salvo no disco, carregará esse assembly e recuperará o tipo desse assembly. Se o assembly não tiver sido salvo no disco quando GetType for chamado, o método retornará null.
GetType não entende assemblies dinâmicos transitórios; portanto, a chamada GetType para recuperar um tipo em um assembly dinâmico transitório retorna null.
No .NET Framework, para usar GetType em um módulo dinâmico, assine o evento AppDomain.AssemblyResolve e chame GetType antes de salvar. Caso contrário, você obterá duas cópias do assembly na memória.
No .NET Core 3.0 e versões posteriores, as cargas de assembly disparadas por essa API são afetadas pelo valor atual de AssemblyLoadContext.CurrentContextualReflectionContext.
A tabela a seguir mostra quais membros de uma classe base são retornados pelos métodos Get ao refletir sobre um tipo.
| Tipo de Membro | Static | Não estático |
|---|---|---|
| Construtor | Não | Não |
| Campo | Não | Sim. Um campo permanece sempre oculto por nome e assinatura. |
| Acontecimento | Não aplicável | A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata as propriedades como hide-by-name-and-signature. Veja a observação 2 abaixo. |
| Método | Não | Sim. Um método (virtual e não virtual) pode permanecer oculto por nome ou por nome e assinatura. |
| Tipo aninhado | Não | Não |
| Property | Não aplicável | A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata as propriedades como hide-by-name-and-signature. Veja a observação 2 abaixo. |
Oculto por nome e assinatura considera todas as partes da assinatura, inclusive modificadores personalizados, tipos de retorno, tipos de parâmetro, sentinelas e convenções de chamada não gerenciadas. Essa é uma comparação binária.
Para reflexão, propriedades e eventos permanecem ocultos por nome e assinatura. Se você tiver uma propriedade com um acessador get e um set na classe base, mas a classe derivada tiver apenas um acessador get, a propriedade de classe derivada ocultará a propriedade de classe base e você não poderá acessar o setter na classe base.
Atributos personalizados não fazem parte do sistema de tipos comuns.
Matrizes ou tipos COM não são pesquisados, a menos que já tenham sido carregados na tabela de classes disponíveis.
typeName pode ser o nome do tipo qualificado por seu namespace ou um nome qualificado para assembly que inclui uma especificação de nome de assembly. Consulte AssemblyQualifiedName.
Se typeName incluir o namespace, mas não o nome do assembly, esse método pesquisa apenas o assembly do objeto de chamada e mscorlib.dll/System.Private.CoreLib.dll, nessa ordem. Se typeName for totalmente qualificado com o nome do assembly parcial ou completo, esse método pesquisa no assembly especificado. Se o assembly tiver um nome forte, um nome de assembly completo será necessário.
A AssemblyQualifiedName propriedade retorna um nome de tipo totalmente qualificado, incluindo tipos aninhados, o nome do assembly e argumentos de tipo genérico. Todos os compiladores que dão suporte ao common language runtime emitirão o nome simples de uma classe aninhada e a reflexão construirá um nome mutilado quando consultado, de acordo com as convenções a seguir.
Note
A arquitetura do processador faz parte da identidade do assembly e pode ser especificada como parte das cadeias de caracteres de nome do assembly. Por exemplo, "ProcessorArchitecture=msil". No entanto, ela não está incluída na cadeia de caracteres retornada pela AssemblyQualifiedName propriedade, por motivos de compatibilidade. Você também pode carregar tipos criando um AssemblyName objeto e passando-o para uma sobrecarga apropriada do Load método. Em seguida, você pode usar o Assembly.GetType método para carregar tipos do assembly. Consulte também AssemblyName.ProcessorArchitecture.
| Delimitador | Meaning |
|---|---|
| Barra invertida (\) | Caractere de escape. |
| Backtick (') | Precede um ou mais dígitos que representam o número de parâmetros de tipo, localizados no final do nome de um tipo genérico. |
| Colchetes ([]) | Coloque uma lista de argumentos de tipo genérico para um tipo genérico construído; em uma lista de argumentos de tipo, coloque um tipo qualificado para assembly. |
| Vírgula (,) | Precede o nome do Assembly. |
| Período (.) | Denota identificadores de namespace. |
| Sinal de adição (+) | Precede uma classe aninhada. |
Por exemplo, o nome totalmente qualificado para uma classe pode ter esta aparência:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Se o namespace fosse TopNamespace.Sub+Namespace, a cadeia de caracteres teria que preceder o sinal de adição (+) com um caractere de escape (\) para impedir que ele fosse interpretado como um separador de aninhamento. A reflexão emite essa cadeia de caracteres da seguinte maneira:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
Um "++" se torna "\+\+", e um "\" se torna "\\".
Esse nome qualificado pode ser persistido e usado posteriormente para carregar o Type. Para pesquisar e carregar um Type, use GetType apenas com o nome do tipo ou com o nome de tipo qualificado do assembly. GetType com o nome do tipo só procurará o Type assembly do chamador e, em seguida, no assembly do Sistema. GetType com o nome de tipo qualificado do assembly procurará em Type qualquer assembly.
Os nomes de tipo podem incluir caracteres à direita que denotam informações adicionais sobre o tipo, como se o tipo é um tipo de referência, um tipo de ponteiro ou um tipo de matriz. Para recuperar o nome do tipo sem esses caracteres à direita, use t.GetElementType().ToString(), onde t está o tipo.
Os espaços são relevantes em todos os componentes de nome de tipo, exceto no nome do assembly. No nome do assembly, os espaços antes do separador '', são relevantes, mas os espaços após o separador ''são ignorados.
O nome de um tipo genérico termina com um backtick (') seguido por dígitos que representam o número de argumentos de tipo genérico. A finalidade desse mangling de nome é permitir que os compiladores ofereçam suporte a tipos genéricos com o mesmo nome, mas com números diferentes de parâmetros de tipo, ocorrendo no mesmo escopo. Por exemplo, a reflexão retorna os nomes mutilados Tuple`1 e Tuple`2 dos métodos genéricos Tuple(Of T) e Tuple(Of T0, T1) no Visual Basic ou Tuple<T> e Tuple<T0, T1> no Visual C#.
Para tipos genéricos, a lista de argumentos de tipo é entre colchetes e os argumentos de tipo são separados por vírgulas. Por exemplo, um genérico Dictionary<TKey,TValue> tem dois parâmetros de tipo. Uma Dictionary<TKey,TValue> das MyType chaves do tipo String pode ser representada da seguinte maneira:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Para especificar um tipo qualificado por assembly dentro de uma lista de argumentos de tipo, coloque o tipo qualificado por assembly entre colchetes. Caso contrário, as vírgulas que separam as partes do nome qualificado para assembly são interpretadas como delimitando argumentos de tipo adicionais. Por exemplo, um Dictionary<TKey,TValue> dos MyType fromMyAssembly.dll, com chaves do tipo String, pode ser especificado da seguinte maneira:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Note
Um tipo qualificado por assembly só pode ser colocado entre colchetes quando ele aparece dentro de uma lista de parâmetros de tipo. As regras para pesquisar assemblies para tipos qualificados e não qualificados em listas de parâmetros de tipo são as mesmas que as regras para tipos não qualificados e não qualificados não qualificados.
Tipos anuláveis são um caso especial de tipos genéricos. Por exemplo, uma anulável Int32 é representada pela cadeia de caracteres "System.Nullable'1[System.Int32]".
Note
Você também pode obter tipos anuláveis usando operadores de tipo. Por exemplo, o tipo de Boolean anulável é retornado por typeof(Nullable<bool>) em C# e por GetType(Nullable(Of Boolean)) em Visual Basic.
A tabela a seguir mostra a sintaxe com GetType a qual você usa para vários tipos.
| Para obter | Utilização |
|---|---|
| Uma anulável Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Um ponteiro não gerenciado para MyType |
Type.GetType("MyType*") |
Um ponteiro não gerenciado para um ponteiro para MyType |
Type.GetType("MyType**") |
Um ponteiro gerenciado ou uma referência a MyType |
Type.GetType("MyType&"). Observe que, ao contrário dos ponteiros, as referências são limitadas a um nível. |
| Uma classe pai e uma classe aninhada | Type.GetType("MyParentClass+MyNestedClass") |
| Uma matriz unidimensional com um limite inferior de 0 | Type.GetType("MyType[]") |
| Uma matriz unidimensional com um limite inferior desconhecido | Type.GetType("MyType[*]") |
| Uma matriz ndimensional | Uma vírgula (,) dentro dos colchetes um total de n-1 vezes. Por exemplo, System.Object[,,] representa uma matriz tridimensional Object . |
| Uma matriz de matrizes unidimensionais | Type.GetType("MyType[][]") |
| Uma matriz bidimensional retangular com limites inferiores desconhecidos | Type.GetType("MyType[,]") |
| Um tipo genérico com um argumento de tipo | Type.GetType("MyGenericType`1[MyType]") |
| Um tipo genérico com dois argumentos de tipo | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
| Um tipo genérico com dois argumentos de tipo qualificados para assembly | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
| Um tipo genérico qualificado por assembly com um argumento de tipo qualificado para assembly | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
| Um tipo genérico cujo argumento de tipo é um tipo genérico com dois argumentos de tipo | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Confira também
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Especificando nomes de tipo totalmente qualificados
Aplica-se a
GetType(String, Boolean)
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
Obtém o Type nome especificado, executando uma pesquisa que diferencia maiúsculas de minúsculas e especificando se uma exceção será gerada se o tipo não for encontrado.
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError);
public static Type GetType(string typeName, bool throwOnError);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName, bool throwOnError);
public static Type? GetType(string typeName, bool throwOnError);
static member GetType : string * bool -> Type
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean) As Type
Parâmetros
- typeName
- String
O nome qualificado do assembly do tipo a ser obtido. Consulte AssemblyQualifiedName. Se o tipo estiver no assembly em execução no momento ou em mscorlib.dll/System.Private.CoreLib.dll, será suficiente fornecer o nome do tipo qualificado por seu namespace.
- throwOnError
- Boolean
true para gerar uma exceção se o tipo não puder ser encontrado; false para retornar null. Especificar false também suprime algumas outras condições de exceção, mas não todas elas. Consulte a seção Exceções.
Retornos
O tipo com o nome especificado. Se o tipo não for encontrado, o throwOnError parâmetro especifica se null é retornado ou uma exceção é gerada. Em alguns casos, uma exceção é gerada independentemente do valor de throwOnError. Consulte a seção Exceções.
- Atributos
Exceções
typeName é null.
Um inicializador de classe é invocado e gera uma exceção.
throwOnError é true e o tipo não foi encontrado.
- ou -
throwOnError é true e typeName contém caracteres inválidos, como uma guia inserida.
- ou -
throwOnError é true e typeName é uma cadeia de caracteres vazia.
- ou -
throwOnError é true e typeName representa um tipo de matriz com um tamanho inválido.
- ou -
typeName representa uma matriz de TypedReference.
throwOnError é true e typeName contém sintaxe inválida. Por exemplo, "MyType[,*,]".
- ou -
typeName representa um tipo genérico que tem um tipo de ponteiro, um ByRef tipo ou Void como um de seus argumentos de tipo.
- ou -
typeName representa um tipo genérico que tem um número incorreto de argumentos de tipo.
- ou -
typeName representa um tipo genérico e um de seus argumentos de tipo não atende às restrições para o parâmetro de tipo correspondente.
throwOnError é true e o assembly ou uma de suas dependências não foi encontrado.
O assembly ou uma de suas dependências foi encontrado, mas não pôde ser carregado.
Observação: em .NET para aplicativos da Windows Store ou a biblioteca de classes Portable, capture a exceção de classe base, IOException.
O assembly ou uma de suas dependências não é válido para o runtime carregado no momento.
Exemplos
O exemplo a seguir recupera o tipo e System.Int32 usa esse objeto de tipo para exibir a FullName propriedade de System.Int32. Se um objeto de tipo se referir a um assembly que não existe, este exemplo gerará uma exceção.
using System;
class GetTypeExample
{
public static void Main()
{
try {
// Get the type of a specified class.
Type myType1 = Type.GetType("System.Int32");
Console.WriteLine("The full name is {0}.\n", myType1.FullName);
}
catch (TypeLoadException e)
{
Console.WriteLine("{0}: Unable to load type System.Int32", e.GetType().Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type myType2 = Type.GetType("NoneSuch", true);
Console.WriteLine("The full name is {0}.", myType2.FullName);
}
catch(TypeLoadException e) {
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name);
}
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
open System
try
// Get the type of a specified class.
let myType1 = Type.GetType "System.Int32"
printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type System.Int32"
try
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
let myType2 = Type.GetType("NoneSuch", true)
printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
Comentários
Você pode usar o GetType método para obter um Type objeto para um tipo em outro assembly se souber seu nome qualificado para assembly, que pode ser obtido de AssemblyQualifiedName.
GetType causa o carregamento do assembly especificado em typeName. Você também pode carregar um assembly usando o Assembly.Load método e, em seguida, usar o Assembly.GetType método ou Assembly.GetTypes para obter Type objetos. Se um tipo estiver em um assembly conhecido pelo programa em tempo de compilação, será mais eficiente usar typeof em C# ou o operador GetType no Visual Basic.
somente .NET Framework: GetType funciona apenas em assemblies carregados do disco. Se você chamar GetType para pesquisar um tipo definido em um assembly dinâmico definido usando os System.Reflection.Emit serviços, você poderá obter um comportamento inconsistente. O comportamento depende se o assembly dinâmico é persistente, ou seja, criado usando os RunAndSave modos ou Save de acesso da System.Reflection.Emit.AssemblyBuilderAccess enumeração. Se o assembly dinâmico for persistente e tiver sido gravado no disco antes GetType de ser chamado, o carregador encontrará o assembly salvo no disco, carregará esse assembly e recuperará o tipo desse assembly. Se o assembly não tiver sido salvo no disco quando GetType for chamado, o método retornará null.
GetType não entende assemblies dinâmicos transitórios; portanto, a chamada GetType para recuperar um tipo em um assembly dinâmico transitório retorna null.
No .NET Framework, para usar GetType em um módulo dinâmico, assine o evento AppDomain.AssemblyResolve e chame GetType antes de salvar. Caso contrário, você obterá duas cópias do assembly na memória.
No .NET Core 3.0 e versões posteriores, as cargas de assembly disparadas por essa API são afetadas pelo valor atual de AssemblyLoadContext.CurrentContextualReflectionContext.
O throwOnError parâmetro especifica o que acontece quando o tipo não é encontrado e também suprime determinadas outras condições de exceção, conforme descrito na seção Exceções. Algumas exceções são geradas independentemente do valor de throwOnError. Por exemplo, se o tipo for encontrado, mas não puder ser carregado, um TypeLoadException será gerado mesmo se throwOnError for false.
A tabela a seguir mostra quais membros de uma classe base são retornados pelos métodos Get ao refletir sobre um tipo.
| Tipo de Membro | Static | Não estático |
|---|---|---|
| Construtor | Não | Não |
| Campo | Não | Sim. Um campo permanece sempre oculto por nome e assinatura. |
| Acontecimento | Não aplicável | A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata as propriedades como hide-by-name-and-signature. Veja a observação 2 abaixo. |
| Método | Não | Sim. Um método (virtual e não virtual) pode permanecer oculto por nome ou por nome e assinatura. |
| Tipo aninhado | Não | Não |
| Property | Não aplicável | A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata as propriedades como hide-by-name-and-signature. Veja a observação 2 abaixo. |
Oculto por nome e assinatura considera todas as partes da assinatura, inclusive modificadores personalizados, tipos de retorno, tipos de parâmetro, sentinelas e convenções de chamada não gerenciadas. Essa é uma comparação binária.
Para reflexão, propriedades e eventos permanecem ocultos por nome e assinatura. Se você tiver uma propriedade com um acessador get e um set na classe base, mas a classe derivada tiver apenas um acessador get, a propriedade de classe derivada ocultará a propriedade de classe base e você não poderá acessar o setter na classe base.
Atributos personalizados não fazem parte do sistema de tipos comuns.
Matrizes ou tipos COM não são pesquisados, a menos que já tenham sido carregados na tabela de classes disponíveis.
typeName pode ser o nome do tipo qualificado por seu namespace ou um nome qualificado para assembly que inclui uma especificação de nome de assembly. Consulte AssemblyQualifiedName.
Se typeName incluir o namespace, mas não o nome do assembly, esse método pesquisa apenas o assembly do objeto de chamada e mscorlib.dll/System.Private.CoreLib.dll, nessa ordem. Se typeName for totalmente qualificado com o nome do assembly parcial ou completo, esse método pesquisa no assembly especificado. Se o assembly tiver um nome forte, um nome de assembly completo será necessário.
A AssemblyQualifiedName propriedade retorna um nome de tipo totalmente qualificado, incluindo tipos aninhados, o nome do assembly e argumentos genéricos. Todos os compiladores que dão suporte ao common language runtime emitirão o nome simples de uma classe aninhada e a reflexão construirá um nome mutilado quando consultado, de acordo com as convenções a seguir.
Note
A arquitetura do processador faz parte da identidade do assembly e pode ser especificada como parte das cadeias de caracteres de nome do assembly. Por exemplo, "ProcessorArchitecture=msil". No entanto, ela não está incluída na cadeia de caracteres retornada pela AssemblyQualifiedName propriedade, por motivos de compatibilidade. Você também pode carregar tipos criando um AssemblyName objeto e passando-o para uma sobrecarga apropriada do Load método. Em seguida, você pode usar o Assembly.GetType método para carregar tipos do assembly. Consulte também AssemblyName.ProcessorArchitecture.
| Delimitador | Meaning |
|---|---|
| Barra invertida (\) | Caractere de escape. |
| Backtick (') | Precede um ou mais dígitos que representam o número de parâmetros de tipo, localizados no final do nome de um tipo genérico. |
| Colchetes ([]) | Coloque uma lista de argumentos de tipo genérico para um tipo genérico construído; em uma lista de argumentos de tipo, coloque um tipo qualificado para assembly. |
| Vírgula (,) | Precede o nome do Assembly. |
| Período (.) | Denota identificadores de namespace. |
| Sinal de adição (+) | Precede uma classe aninhada. |
Por exemplo, o nome totalmente qualificado para uma classe pode ter esta aparência:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Se o namespace fosse TopNamespace.Sub+Namespace, a cadeia de caracteres teria que preceder o sinal de adição (+) com um caractere de escape (\) para impedir que ele fosse interpretado como um separador de aninhamento. A reflexão emite essa cadeia de caracteres da seguinte maneira:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
Um "++" se torna "\+\+", e um "\" se torna "\\".
Esse nome qualificado pode ser persistido e usado posteriormente para carregar o Type. Para pesquisar e carregar um Type, use GetType apenas com o nome do tipo ou com o nome de tipo qualificado do assembly. GetType com o nome do tipo só procurará o Type assembly do chamador e, em seguida, no assembly do Sistema. GetType com o nome de tipo qualificado do assembly procurará em Type qualquer assembly.
Os nomes de tipo podem incluir caracteres à direita que denotam informações adicionais sobre o tipo, como se o tipo é um tipo de referência, um tipo de ponteiro ou um tipo de matriz. Para recuperar o nome do tipo sem esses caracteres à direita, use t.GetElementType().ToString(), onde t está o tipo.
Os espaços são relevantes em todos os componentes de nome de tipo, exceto no nome do assembly. No nome do assembly, os espaços antes do separador '', são relevantes, mas os espaços após o separador ''são ignorados.
O nome de um tipo genérico termina com um backtick (') seguido por dígitos que representam o número de argumentos de tipo genérico. A finalidade desse mangling de nome é permitir que os compiladores ofereçam suporte a tipos genéricos com o mesmo nome, mas com números diferentes de parâmetros de tipo, ocorrendo no mesmo escopo. Por exemplo, a reflexão retorna os nomes mutilados Tuple`1 e Tuple`2 dos métodos genéricos Tuple(Of T) e Tuple(Of T0, T1) no Visual Basic ou Tuple<T> e Tuple<T0, T1> no Visual C#.
Para tipos genéricos, a lista de argumentos de tipo é entre colchetes e os argumentos de tipo são separados por vírgulas. Por exemplo, um genérico Dictionary<TKey,TValue> tem dois parâmetros de tipo. Uma Dictionary<TKey,TValue> das MyType chaves do tipo String pode ser representada da seguinte maneira:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Para especificar um tipo qualificado por assembly dentro de uma lista de argumentos de tipo, coloque o tipo qualificado por assembly entre colchetes. Caso contrário, as vírgulas que separam as partes do nome qualificado para assembly são interpretadas como delimitando argumentos de tipo adicionais. Por exemplo, um Dictionary<TKey,TValue> de MyType MyAssembly.dll, com chaves do tipo String, pode ser especificado da seguinte maneira:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Note
Um tipo qualificado por assembly só pode ser colocado entre colchetes quando ele aparece dentro de uma lista de parâmetros de tipo. As regras para pesquisar assemblies para tipos qualificados e não qualificados em listas de parâmetros de tipo são as mesmas que as regras para tipos não qualificados e não qualificados não qualificados.
Tipos anuláveis são um caso especial de tipos genéricos. Por exemplo, uma anulável Int32 é representada pela cadeia de caracteres "System.Nullable'1[System.Int32]".
Note
Você também pode obter tipos anuláveis usando operadores de tipo. Por exemplo, o tipo de Boolean anulável é retornado por typeof(Nullable<bool>) em C# e por GetType(Nullable(Of Boolean)) em Visual Basic.
A tabela a seguir mostra a sintaxe com GetType a qual você usa para vários tipos.
| Para obter | Utilização |
|---|---|
| Uma anulável Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Um ponteiro não gerenciado para MyType |
Type.GetType("MyType*") |
Um ponteiro não gerenciado para um ponteiro para MyType |
Type.GetType("MyType**") |
Um ponteiro gerenciado ou uma referência a MyType |
Type.GetType("MyType&"). Observe que, ao contrário dos ponteiros, as referências são limitadas a um nível. |
| Uma classe pai e uma classe aninhada | Type.GetType("MyParentClass+MyNestedClass") |
| Uma matriz unidimensional com um limite inferior de 0 | Type.GetType("MyArray[]") |
| Uma matriz unidimensional com um limite inferior desconhecido | Type.GetType("MyArray[*]") |
| Uma matriz ndimensional | Uma vírgula (,) dentro dos colchetes um total de n-1 vezes. Por exemplo, System.Object[,,] representa uma matriz tridimensional Object . |
| Uma matriz bidimensional | Type.GetType("MyArray[][]") |
| Uma matriz bidimensional retangular com limites inferiores desconhecidos | Type.GetType("MyArray[,]") |
| Um tipo genérico com um argumento de tipo | Type.GetType("MyGenericType`1[MyType]") |
| Um tipo genérico com dois argumentos de tipo | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
| Um tipo genérico com dois argumentos de tipo qualificados para assembly | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
| Um tipo genérico qualificado por assembly com um argumento de tipo qualificado para assembly | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
| Um tipo genérico cujo argumento de tipo é um tipo genérico com dois argumentos de tipo | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Confira também
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Especificando nomes de tipo totalmente qualificados
Aplica-se a
GetType(String, Boolean, Boolean)
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
Obtém o Type nome com o nome especificado, especificando se uma exceção será gerada se o tipo não for encontrado e se deseja executar uma pesquisa que diferencia maiúsculas de minúsculas.
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError, bool ignoreCase);
public static Type GetType(string typeName, bool throwOnError, bool ignoreCase);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName, bool throwOnError, bool ignoreCase);
public static Type? GetType(string typeName, bool throwOnError, bool ignoreCase);
static member GetType : string * bool * bool -> Type
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * bool * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean, ignoreCase As Boolean) As Type
Parâmetros
- typeName
- String
O nome qualificado do assembly do tipo a ser obtido. Consulte AssemblyQualifiedName. Se o tipo estiver no assembly em execução no momento ou em mscorlib.dll/System.Private.CoreLib.dll, será suficiente fornecer o nome do tipo qualificado por seu namespace.
- throwOnError
- Boolean
true para gerar uma exceção se o tipo não puder ser encontrado; false para retornar null. Especificar false também suprime algumas outras condições de exceção, mas não todas elas. Consulte a seção Exceções.
- ignoreCase
- Boolean
true para executar uma pesquisa typeNameque não diferencia maiúsculas de minúsculas, false para executar uma pesquisa typeNameque diferencia maiúsculas de minúsculas.
Retornos
O tipo com o nome especificado. Se o tipo não for encontrado, o throwOnError parâmetro especifica se null é retornado ou uma exceção é gerada. Em alguns casos, uma exceção é gerada independentemente do valor de throwOnError. Consulte a seção Exceções.
- Atributos
Exceções
typeName é null.
Um inicializador de classe é invocado e gera uma exceção.
throwOnError é true e o tipo não foi encontrado.
- ou -
throwOnError é true e typeName contém caracteres inválidos, como uma guia inserida.
- ou -
throwOnError é true e typeName é uma cadeia de caracteres vazia.
- ou -
throwOnError é true e typeName representa um tipo de matriz com um tamanho inválido.
- ou -
typeName representa uma matriz de TypedReference.
throwOnError é true e typeName contém sintaxe inválida. Por exemplo, "MyType[,*,]".
- ou -
typeName representa um tipo genérico que tem um tipo de ponteiro, um ByRef tipo ou Void como um de seus argumentos de tipo.
- ou -
typeName representa um tipo genérico que tem um número incorreto de argumentos de tipo.
- ou -
typeName representa um tipo genérico e um de seus argumentos de tipo não atende às restrições para o parâmetro de tipo correspondente.
throwOnError é true e o assembly ou uma de suas dependências não foi encontrado.
O assembly ou uma de suas dependências foi encontrado, mas não pôde ser carregado.
O assembly não é válido para o runtime carregado no momento.
Comentários
Você pode usar o GetType método para obter um Type objeto para um tipo em outro assembly se souber seu nome qualificado para assembly, que pode ser obtido de AssemblyQualifiedName.
GetType causa o carregamento do assembly especificado em typeName. Você também pode carregar um assembly usando o Assembly.Load método e, em seguida, usar o Assembly.GetType método ou Assembly.GetTypes para obter Type objetos. Se um tipo estiver em um assembly conhecido pelo programa em tempo de compilação, será mais eficiente usar typeof em C# ou o operador GetType no Visual Basic.
somente .NET Framework: GetType funciona apenas em assemblies carregados do disco. Se você chamar GetType para pesquisar um tipo definido em um assembly dinâmico definido usando os System.Reflection.Emit serviços, você poderá obter um comportamento inconsistente. O comportamento depende se o assembly dinâmico é persistente, ou seja, criado usando os RunAndSave modos ou Save de acesso da System.Reflection.Emit.AssemblyBuilderAccess enumeração. Se o assembly dinâmico for persistente e tiver sido gravado no disco antes GetType de ser chamado, o carregador encontrará o assembly salvo no disco, carregará esse assembly e recuperará o tipo desse assembly. Se o assembly não tiver sido salvo no disco quando GetType for chamado, o método retornará null.
GetType não entende assemblies dinâmicos transitórios; portanto, a chamada GetType para recuperar um tipo em um assembly dinâmico transitório retorna null.
No .NET Framework, para usar GetType em um módulo dinâmico, assine o evento AppDomain.AssemblyResolve e chame GetType antes de salvar. Caso contrário, você obterá duas cópias do assembly na memória.
No .NET Core 3.0 e versões posteriores, as cargas de assembly disparadas por essa API são afetadas pelo valor atual de AssemblyLoadContext.CurrentContextualReflectionContext.
O throwOnError parâmetro especifica o que acontece quando o tipo não é encontrado e também suprime determinadas outras condições de exceção, conforme descrito na seção Exceções. Algumas exceções são geradas independentemente do valor de throwOnError. Por exemplo, se o tipo for encontrado, mas não puder ser carregado, um TypeLoadException será gerado mesmo se throwOnError for false.
A tabela a seguir mostra quais membros de uma classe base são retornados pelos métodos Get ao refletir sobre um tipo.
| Tipo de Membro | Static | Não estático |
|---|---|---|
| Construtor | Não | Não |
| Campo | Não | Sim. Um campo permanece sempre oculto por nome e assinatura. |
| Acontecimento | Não aplicável | A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata as propriedades como hide-by-name-and-signature. Veja a observação 2 abaixo. |
| Método | Não | Sim. Um método (virtual e não virtual) pode permanecer oculto por nome ou por nome e assinatura. |
| Tipo aninhado | Não | Não |
| Property | Não aplicável | A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata as propriedades como hide-by-name-and-signature. Veja a observação 2 abaixo. |
Oculto por nome e assinatura considera todas as partes da assinatura, inclusive modificadores personalizados, tipos de retorno, tipos de parâmetro, sentinelas e convenções de chamada não gerenciadas. Essa é uma comparação binária.
Para reflexão, propriedades e eventos permanecem ocultos por nome e assinatura. Se você tiver uma propriedade com um acessador get e um set na classe base, mas a classe derivada tiver apenas um acessador get, a propriedade de classe derivada ocultará a propriedade de classe base e você não poderá acessar o setter na classe base.
Atributos personalizados não fazem parte do sistema de tipos comuns.
Matrizes ou tipos COM não são pesquisados, a menos que já tenham sido carregados na tabela de classes disponíveis.
typeName pode ser o nome do tipo qualificado por seu namespace ou um nome qualificado para assembly que inclui uma especificação de nome de assembly. Consulte AssemblyQualifiedName.
Se typeName incluir o namespace, mas não o nome do assembly, esse método pesquisa apenas o assembly do objeto de chamada e mscorlib.dll/System.Private.CoreLib.dll, nessa ordem. Se typeName for totalmente qualificado com o nome do assembly parcial ou completo, esse método pesquisa no assembly especificado. Se o assembly tiver um nome forte, um nome de assembly completo será necessário.
A AssemblyQualifiedName propriedade retorna um nome de tipo totalmente qualificado, incluindo tipos aninhados, o nome do assembly e argumentos de tipo. Todos os compiladores que dão suporte ao common language runtime emitirão o nome simples de uma classe aninhada e a reflexão construirá um nome mutilado quando consultado, de acordo com as convenções a seguir.
Note
A arquitetura do processador faz parte da identidade do assembly e pode ser especificada como parte das cadeias de caracteres de nome do assembly. Por exemplo, "ProcessorArchitecture=msil". No entanto, ela não está incluída na cadeia de caracteres retornada pela AssemblyQualifiedName propriedade, por motivos de compatibilidade. Você também pode carregar tipos criando um AssemblyName objeto e passando-o para uma sobrecarga apropriada do Load método. Em seguida, você pode usar o Assembly.GetType método para carregar tipos do assembly. Consulte também AssemblyName.ProcessorArchitecture.
| Delimitador | Meaning |
|---|---|
| Barra invertida (\) | Caractere de escape. |
| Backtick (') | Precede um ou mais dígitos que representam o número de parâmetros de tipo, localizados no final do nome de um tipo genérico. |
| Colchetes ([]) | Coloque uma lista de argumentos de tipo genérico para um tipo genérico construído; em uma lista de argumentos de tipo, coloque um tipo qualificado para assembly. |
| Vírgula (,) | Precede o nome do Assembly. |
| Período (.) | Denota identificadores de namespace. |
| Sinal de adição (+) | Precede uma classe aninhada. |
Por exemplo, o nome totalmente qualificado para uma classe pode ter esta aparência:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Se o namespace fosse TopNamespace.Sub+Namespace, a cadeia de caracteres teria que preceder o sinal de adição (+) com um caractere de escape (\) para impedir que ele fosse interpretado como um separador de aninhamento. A reflexão emite essa cadeia de caracteres da seguinte maneira:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
Um "++" se torna "\+\+", e um "\" se torna "\\".
Esse nome qualificado pode ser persistido e usado posteriormente para carregar o Type. Para pesquisar e carregar um Type, use GetType apenas com o nome do tipo ou com o nome de tipo qualificado do assembly. GetType com o nome do tipo só procurará o Type assembly do chamador e, em seguida, no assembly do Sistema. GetType com o nome de tipo qualificado do assembly procurará em Type qualquer assembly.
Os nomes de tipo podem incluir caracteres à direita que denotam informações adicionais sobre o tipo, como se o tipo é um tipo de referência, um tipo de ponteiro ou um tipo de matriz. Para recuperar o nome do tipo sem esses caracteres à direita, use t.GetElementType().ToString(), onde t está o tipo.
Os espaços são relevantes em todos os componentes de nome de tipo, exceto no nome do assembly. No nome do assembly, os espaços antes do separador '', são relevantes, mas os espaços após o separador ''são ignorados.
O nome de um tipo genérico termina com um backtick (') seguido por dígitos que representam o número de argumentos de tipo genérico. A finalidade desse mangling de nome é permitir que os compiladores ofereçam suporte a tipos genéricos com o mesmo nome, mas com números diferentes de parâmetros de tipo, ocorrendo no mesmo escopo. Por exemplo, a reflexão retorna os nomes mutilados Tuple`1 e Tuple`2 dos métodos genéricos Tuple(Of T) e Tuple(Of T0, T1) no Visual Basic ou Tuple<T> e Tuple<T0, T1> no Visual C#.
Para tipos genéricos, a lista de argumentos de tipo é entre colchetes e os argumentos de tipo são separados por vírgulas. Por exemplo, um genérico Dictionary<TKey,TValue> tem dois parâmetros de tipo. Uma Dictionary<TKey,TValue> das MyType chaves do tipo String pode ser representada da seguinte maneira:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Para especificar um tipo qualificado por assembly dentro de uma lista de argumentos de tipo, coloque o tipo qualificado por assembly entre colchetes. Caso contrário, as vírgulas que separam as partes do nome qualificado para assembly são interpretadas como delimitando argumentos de tipo adicionais. Por exemplo, um Dictionary<TKey,TValue> de MyType MyAssembly.dll, com chaves do tipo String, pode ser especificado da seguinte maneira:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Note
Um tipo qualificado por assembly só pode ser colocado entre colchetes quando ele aparece dentro de uma lista de parâmetros de tipo. As regras para pesquisar assemblies para tipos qualificados e não qualificados em listas de parâmetros de tipo são as mesmas que as regras para tipos não qualificados e não qualificados não qualificados.
Tipos anuláveis são um caso especial de tipos genéricos. Por exemplo, uma anulável Int32 é representada pela cadeia de caracteres "System.Nullable'1[System.Int32]".
Note
Você também pode obter tipos anuláveis usando operadores de tipo. Por exemplo, o tipo de Boolean anulável é retornado por typeof(Nullable<bool>) em C# e por GetType(Nullable(Of Boolean)) em Visual Basic.
A tabela a seguir mostra a sintaxe com GetType a qual você usa para vários tipos.
| Para obter | Utilização |
|---|---|
| Uma anulável Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Um ponteiro não gerenciado para MyType |
Type.GetType("MyType*") |
Um ponteiro não gerenciado para um ponteiro para MyType |
Type.GetType("MyType**") |
Um ponteiro gerenciado ou uma referência a MyType |
Type.GetType("MyType&"). Observe que, ao contrário dos ponteiros, as referências são limitadas a um nível. |
| Uma classe pai e uma classe aninhada | Type.GetType("MyParentClass+MyNestedClass") |
| Uma matriz unidimensional com um limite inferior de 0 | Type.GetType("MyArray[]") |
| Uma matriz unidimensional com um limite inferior desconhecido | Type.GetType("MyArray[*]") |
| Uma matriz ndimensional | Uma vírgula (,) dentro dos colchetes um total de n-1 vezes. Por exemplo, System.Object[,,] representa uma matriz tridimensional Object . |
| Uma matriz bidimensional | Type.GetType("MyArray[][]") |
| Uma matriz bidimensional retangular com limites inferiores desconhecidos | Type.GetType("MyArray[,]") |
| Um tipo genérico com um argumento de tipo | Type.GetType("MyGenericType`1[MyType]") |
| Um tipo genérico com dois argumentos de tipo | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
| Um tipo genérico com dois argumentos de tipo qualificados para assembly | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
| Um tipo genérico qualificado por assembly com um argumento de tipo qualificado para assembly | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
| Um tipo genérico cujo argumento de tipo é um tipo genérico com dois argumentos de tipo | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Confira também
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Especificando nomes de tipo totalmente qualificados
Aplica-se a
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
Obtém o tipo com o nome especificado, opcionalmente fornecendo métodos personalizados para resolver o assembly e o tipo.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver);
public static Type GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver);
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> -> Type
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type)) As Type
Parâmetros
- typeName
- String
O nome do tipo a ser obtido. Se o typeResolver parâmetro for fornecido, o nome do tipo poderá ser qualquer cadeia typeResolver de caracteres capaz de resolver. Se o assemblyResolver parâmetro for fornecido ou se a resolução de tipo padrão for usada, typeName deverá ser um nome qualificado para assembly (consulte AssemblyQualifiedName), a menos que o tipo esteja no assembly em execução no momento ou em mscorlib.dll/System.Private.CoreLib.dll, nesse caso, é suficiente fornecer o nome do tipo qualificado pelo namespace.
- assemblyResolver
- Func<AssemblyName,Assembly>
Um método que localiza e retorna o assembly especificado em typeName. O nome do assembly é passado como assemblyResolver um AssemblyName objeto. Se typeName não contiver o nome de um assembly, assemblyResolver não será chamado. Se assemblyResolver não for fornecido, a resolução de assembly padrão será executada.
Cuidado: não passe métodos de chamadores desconhecidos ou não confiáveis. Isso pode resultar em elevação de privilégio para código mal-intencionado. Use apenas os métodos que você fornece ou com os quais esteja familiarizado.
Um método que localiza e retorna o tipo especificado pelo typeName assembly que é retornado por assemblyResolver ou pela resolução de assembly padrão. Se nenhum assembly for fornecido, o typeResolver método poderá fornecer um. O método também usa um parâmetro que especifica se uma pesquisa não diferencia maiúsculas de minúsculas; false é passado para esse parâmetro.
Cuidado: não passe métodos de chamadores desconhecidos ou não confiáveis.
Retornos
O tipo com o nome especificado ou null se o tipo não for encontrado.
- Atributos
Exceções
typeName é null.
Um inicializador de classe é invocado e gera uma exceção.
Ocorre um erro quando typeName é analisado em um nome de tipo e um nome de assembly (por exemplo, quando o nome do tipo simples inclui um caractere especial sem escape).
- ou -
typeName representa um tipo genérico que tem um tipo de ponteiro, um ByRef tipo ou Void como um de seus argumentos de tipo.
- ou -
typeName representa um tipo genérico que tem um número incorreto de argumentos de tipo.
- ou -
typeName representa um tipo genérico e um de seus argumentos de tipo não atende às restrições para o parâmetro de tipo correspondente.
typeName representa um tipo inválido, por exemplo, uma matriz de TypedReference.
O assembly ou uma de suas dependências foi encontrado, mas não pôde ser carregado.
- ou -
typeName contém um nome de assembly inválido.
- ou -
typeName é um nome de assembly válido sem um nome de tipo.
O assembly ou uma de suas dependências não é válido para o runtime carregado no momento.
Comentários
Cenários de uso para esse método e detalhes sobre os assemblyResolver parâmetros e typeResolver podem ser encontrados na sobrecarga do GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) método.
Note
Se typeName não for possível encontrar, a chamada para o GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) método retornará null. Ele não gera uma exceção. Para controlar se uma exceção é gerada, chame uma sobrecarga do GetType método que tem um throwOnError parâmetro.
Chamar essa sobrecarga de método é o mesmo que chamar a sobrecarga do GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) método e especificar false para os parâmetros ethrowOnError.ignoreCase
Aplica-se a
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
Obtém o tipo com o nome especificado, especificando se uma exceção será gerada se o tipo não for encontrado e, opcionalmente, fornecendo métodos personalizados para resolver o assembly e o tipo.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError);
public static Type GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError);
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool -> Type
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean) As Type
Parâmetros
- typeName
- String
O nome do tipo a ser obtido. Se o typeResolver parâmetro for fornecido, o nome do tipo poderá ser qualquer cadeia typeResolver de caracteres capaz de resolver. Se o assemblyResolver parâmetro for fornecido ou se a resolução de tipo padrão for usada, typeName deverá ser um nome qualificado para assembly (consulte AssemblyQualifiedName), a menos que o tipo esteja no assembly em execução no momento ou em mscorlib.dll/System.Private.CoreLib.dll, nesse caso, é suficiente fornecer o nome do tipo qualificado pelo namespace.
- assemblyResolver
- Func<AssemblyName,Assembly>
Um método que localiza e retorna o assembly especificado em typeName. O nome do assembly é passado como assemblyResolver um AssemblyName objeto. Se typeName não contiver o nome de um assembly, assemblyResolver não será chamado. Se assemblyResolver não for fornecido, a resolução de assembly padrão será executada.
Cuidado: não passe métodos de chamadores desconhecidos ou não confiáveis. Isso pode resultar em elevação de privilégio para código mal-intencionado. Use apenas os métodos que você fornece ou com os quais esteja familiarizado.
Um método que localiza e retorna o tipo especificado pelo typeName assembly que é retornado por assemblyResolver ou pela resolução de assembly padrão. Se nenhum assembly for fornecido, o método poderá fornecer um. O método também usa um parâmetro que especifica se uma pesquisa não diferencia maiúsculas de minúsculas; false é passado para esse parâmetro.
Cuidado: não passe métodos de chamadores desconhecidos ou não confiáveis.
- throwOnError
- Boolean
true para gerar uma exceção se o tipo não puder ser encontrado; false para retornar null. Especificar false também suprime algumas outras condições de exceção, mas não todas elas. Consulte a seção Exceções.
Retornos
O tipo com o nome especificado. Se o tipo não for encontrado, o throwOnError parâmetro especifica se null é retornado ou uma exceção é gerada. Em alguns casos, uma exceção é gerada independentemente do valor de throwOnError. Consulte a seção Exceções.
- Atributos
Exceções
typeName é null.
Um inicializador de classe é invocado e gera uma exceção.
throwOnError é true e o tipo não foi encontrado.
- ou -
throwOnError é true e typeName contém caracteres inválidos, como uma guia inserida.
- ou -
throwOnError é true e typeName é uma cadeia de caracteres vazia.
- ou -
throwOnError é true e typeName representa um tipo de matriz com um tamanho inválido.
- ou -
typeName representa uma matriz de TypedReference.
Ocorre um erro quando typeName é analisado em um nome de tipo e um nome de assembly (por exemplo, quando o nome do tipo simples inclui um caractere especial sem escape).
- ou -
throwOnError é true e typeName contém sintaxe inválida (por exemplo, "MyType[,*,]").
- ou -
typeName representa um tipo genérico que tem um tipo de ponteiro, um ByRef tipo ou Void como um de seus argumentos de tipo.
- ou -
typeName representa um tipo genérico que tem um número incorreto de argumentos de tipo.
- ou -
typeName representa um tipo genérico e um de seus argumentos de tipo não atende às restrições para o parâmetro de tipo correspondente.
throwOnError é true e o assembly ou uma de suas dependências não foi encontrado.
- ou -
typeName contém um nome de assembly inválido.
- ou -
typeName é um nome de assembly válido sem um nome de tipo.
O assembly ou uma de suas dependências foi encontrado, mas não pôde ser carregado.
O assembly ou uma de suas dependências não é válido para o runtime carregado no momento.
Comentários
Cenários de uso para esse método e detalhes sobre os assemblyResolver parâmetros e typeResolver podem ser encontrados na sobrecarga do GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) método.
Chamar essa sobrecarga de método é o mesmo que chamar a sobrecarga do GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) método e especificar false para o ignoreCase parâmetro.
Aplica-se a
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
- Origem:
- Type.CoreCLR.cs
Obtém o tipo com o nome especificado, especificando se uma pesquisa diferencia maiúsculas de minúsculas e se deseja gerar uma exceção se o tipo não for encontrado e, opcionalmente, fornecer métodos personalizados para resolver o assembly e o tipo.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError, bool ignoreCase);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError, bool ignoreCase);
public static Type GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError, bool ignoreCase);
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError, bool ignoreCase);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool * bool -> Type
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool * bool -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean, ignoreCase As Boolean) As Type
Parâmetros
- typeName
- String
O nome do tipo a ser obtido. Se o typeResolver parâmetro for fornecido, o nome do tipo poderá ser qualquer cadeia typeResolver de caracteres capaz de resolver. Se o assemblyResolver parâmetro for fornecido ou se a resolução de tipo padrão for usada, typeName deverá ser um nome qualificado para assembly (consulte AssemblyQualifiedName), a menos que o tipo esteja no assembly em execução no momento ou em mscorlib.dll/System.Private.CoreLib.dll, nesse caso, é suficiente fornecer o nome do tipo qualificado pelo namespace.
- assemblyResolver
- Func<AssemblyName,Assembly>
Um método que localiza e retorna o assembly especificado em typeName. O nome do assembly é passado como assemblyResolver um AssemblyName objeto. Se typeName não contiver o nome de um assembly, assemblyResolver não será chamado. Se assemblyResolver não for fornecido, a resolução de assembly padrão será executada.
Cuidado: não passe métodos de chamadores desconhecidos ou não confiáveis. Isso pode resultar em elevação de privilégio para código mal-intencionado. Use apenas os métodos que você fornece ou com os quais esteja familiarizado.
Um método que localiza e retorna o tipo especificado pelo typeName assembly que é retornado por assemblyResolver ou pela resolução de assembly padrão. Se nenhum assembly for fornecido, o método poderá fornecer um. O método também usa um parâmetro que especifica se uma pesquisa não diferencia maiúsculas de minúsculas; o valor de ignoreCase é passado para esse parâmetro.
Cuidado: não passe métodos de chamadores desconhecidos ou não confiáveis.
- throwOnError
- Boolean
true para gerar uma exceção se o tipo não puder ser encontrado; false para retornar null. Especificar false também suprime algumas outras condições de exceção, mas não todas elas. Consulte a seção Exceções.
- ignoreCase
- Boolean
true para executar uma pesquisa typeNameque não diferencia maiúsculas de minúsculas, false para executar uma pesquisa typeNameque diferencia maiúsculas de minúsculas.
Retornos
O tipo com o nome especificado. Se o tipo não for encontrado, o throwOnError parâmetro especifica se null é retornado ou uma exceção é gerada. Em alguns casos, uma exceção é gerada independentemente do valor de throwOnError. Consulte a seção Exceções.
- Atributos
Exceções
typeName é null.
Um inicializador de classe é invocado e gera uma exceção.
throwOnError é true e o tipo não foi encontrado.
- ou -
throwOnError é true e typeName contém caracteres inválidos, como uma guia inserida.
- ou -
throwOnError é true e typeName é uma cadeia de caracteres vazia.
- ou -
throwOnError é true e typeName representa um tipo de matriz com um tamanho inválido.
- ou -
typeName representa uma matriz de TypedReference.
Ocorre um erro quando typeName é analisado em um nome de tipo e um nome de assembly (por exemplo, quando o nome do tipo simples inclui um caractere especial sem escape).
- ou -
throwOnError é true e typeName contém sintaxe inválida (por exemplo, "MyType[,*,]").
- ou -
typeName representa um tipo genérico que tem um tipo de ponteiro, um ByRef tipo ou Void como um de seus argumentos de tipo.
- ou -
typeName representa um tipo genérico que tem um número incorreto de argumentos de tipo.
- ou -
typeName representa um tipo genérico e um de seus argumentos de tipo não atende às restrições para o parâmetro de tipo correspondente.
throwOnError é true e o assembly ou uma de suas dependências não foi encontrado.
O assembly ou uma de suas dependências foi encontrado, mas não pôde ser carregado.
- ou -
typeName contém um nome de assembly inválido.
- ou -
typeName é um nome de assembly válido sem um nome de tipo.
O assembly ou uma de suas dependências não é um assembly válido para o runtime carregado no momento.
Comentários
No .NET Core 3.0 e versões posteriores, se assemblyResolver for nulo, as cargas de assembly disparadas por essa API serão afetadas pelo valor atual de AssemblyLoadContext.CurrentContextualReflectionContext.
Use a sobrecarga do GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) método e suas sobrecargas associadas (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) e GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) para substituir a implementação padrão do GetType método por implementações mais flexíveis. Ao fornecer seus próprios métodos que resolvem os nomes dos tipos e dos assemblies que os contêm, você pode fazer o seguinte:
- Controlar de qual versão de um assembly um tipo é carregado.
- Fornecer outro local para procurar um nome de tipo que não inclua um nome de assembly.
- Carregar assemblies usando nomes parciais.
- Retornar subclasses de System.Type que não são criadas pelo Common Language Runtime (CLR).
Por exemplo, na serialização tolerante à versão, esse método permite que você pesquise por um conjunto de código mais adequado usando um nome parcial. Outras sobrecargas do método GetType exigem um nome de tipo qualificado para assembly, que inclui o número da versão.
Implementações alternativas do sistema de tipos podem precisar retornar subclasses de System.Type que não são criadas pelo CLR; todos os tipos retornados por outras sobrecargas do método GetType são tipos de tempo de execução.
Notas de utilização
Essa sobrecarga de método e as sobrecargas associadas analisam typeName no nome de um tipo e o nome de um assembly e resolvem os nomes. A resolução do nome do assembly ocorre antes da resolução do nome do tipo, pois um nome de tipo deve ser resolvido no contexto de um assembly.
Note
Se você não estiver familiarizado com o conceito de nomes de tipo qualificados para assembly, consulte a propriedade AssemblyQualifiedName.
Se typeName não for um nome qualificado para assembly, a resolução do assembly será ignorada. Nomes de tipo não qualificados podem ser resolvidos no contexto de mscorlib.dll/System.Private.CoreLib.dll ou no assembly em execução no momento, ou você pode fornecer um assembly no parâmetro typeResolver. Os efeitos de incluir ou omitir o nome do assembly para diferentes tipos de resolução de nomes são exibidos em forma de tabela na seção Resolução de nomes mistos.
Notas de uso geral:
Não passe métodos para
assemblyResolveroutypeResolverse eles vêm de chamadores desconhecidos ou não confiáveis. Use apenas os métodos que você fornece ou com os quais esteja familiarizado.Caution
Usar métodos de chamadores desconhecidos ou não confiáveis pode resultar em elevação de privilégio para código mal-intencionado.
Se você omitir os parâmetros
assemblyResolvere/outypeResolver, o valor do parâmetrothrowOnErrorserá passado para os métodos que executam a resolução padrão.Se
throwOnErrorfortrue, esse método gerará um TypeLoadException quandotypeResolverretornarnulle um FileNotFoundException quandoassemblyResolverretornarnull.Esse método não captura exceções geradas por
assemblyResolveretypeResolver. Você é responsável por quaisquer exceções geradas pelos métodos resolvedores.
Resolver assemblies
O método assemblyResolver recebe um objeto AssemblyName, que é produzido ao analisar o nome do assembly da cadeia de caracteres incluído em typeName. Se typeName não contiver um nome de assembly, assemblyResolver não será chamado e null será passado para typeResolver.
Caso assemblyResolver não seja fornecido, a sondagem de assembly padrão será utilizada para localizar o assembly. Se assemblyResolver estiver fornecido, o método GetType não fará a sondagem padrão. Nesse caso, é necessário garantir que assemblyResolver consiga lidar com todos os assemblies transmitidos.
O método assemblyResolver deverá retornar null se o assembly não puder ser resolvido. Se assemblyResolver retornar null, typeResolver não será chamado e nenhum processamento adicional ocorrerá; além disso, se throwOnError for true, será lançado um FileNotFoundException.
Se o AssemblyName que é passado para assemblyResolver é um nome parcial, uma ou mais de suas partes são null. Por exemplo, se não tiver nenhuma versão, a Version propriedade será null. Se a Version propriedade, a CultureInfo propriedade e o GetPublicKeyToken método retornarem null, somente o nome simples do assembly foi fornecido. O assemblyResolver método pode usar ou ignorar todas as partes do nome do assembly.
Os efeitos de diferentes opções de resolução de assembly são exibidos como uma tabela na seção Resolução de nomes mistos, para nomes de tipo simples e qualificados por assembly.
Resolver tipos
Se typeName não especificar um nome de assembly, typeResolver sempre será chamado. Se typeName especificar um nome de assembly, typeResolver será chamado somente quando o nome do assembly for resolvido com êxito. Se assemblyResolver ou a sondagem de assembly padrão retornar null, typeResolver não será chamado.
O typeResolver método recebe três argumentos:
- O assembly a ser pesquisado ou
nullsetypeNamenão contiver um nome de assembly. - O nome simples do tipo. No caso de um tipo aninhado, este é o tipo externo mais abrangente. No caso de um tipo genérico, esse é o nome simples do tipo genérico.
- Um valor booleano que será
truese o caso dos nomes de tipos precisar ser ignorado.
A implementação determina a maneira como esses argumentos são usados. O typeResolver método deverá retornar null se não puder resolver o tipo. Se typeResolver retornar null e throwOnError for true, essa sobrecarga de GetType lançará um TypeLoadException.
Os efeitos de diferentes opções de resolução de tipo são exibidos como uma tabela na seção Resolução de nomes mistos, para nomes de tipo simples e qualificados por assembly.
Resolver tipos aninhados
Se typeName for um tipo aninhado, somente o nome do tipo mais externo que contém será transmitido para typeResolver. Quando `typeResolver` retorna esse tipo, o método `GetNestedType` é chamado recursivamente até que o tipo aninhado mais interno seja resolvido.
Resolver tipos genéricos
O GetType é chamado recursivamente para resolver tipos genéricos: primeiro para resolver o tipo genérico em si e, em seguida, para resolver seus argumentos de tipo. Se um argumento de tipo for genérico, GetType será chamado recursivamente para resolver seus argumentos de tipo e assim por diante.
A combinação de assemblyResolver e typeResolver que você fornece deve ser capaz de resolver todos os níveis dessa recursão. Por exemplo, suponha que você forneça um assemblyResolver que controla o carregamento de MyAssembly. Suponha que você queira resolver o tipo Dictionary<string, MyType> genérico (Dictionary(Of String, MyType) no Visual Basic). Você pode transmitir o seguinte nome de tipo genérico:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
O MyType é o único argumento de tipo qualificado por assembly. Os nomes das classes Dictionary<TKey,TValue> e String não são qualificados por assembly. O typeResolver deve ser capaz de lidar com um assembly ou null, pois ele receberá null para Dictionary<TKey,TValue> e String. Ele pode lidar com esse caso chamando uma sobrecarga do método GetType que usa uma cadeia de caracteres, pois os dois nomes de tipo não qualificados estão em mscorlib.dll/System.Private.CoreLib.dll:
Type t = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore)
);
let t =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else null),
fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr))
O método assemblyResolver não é chamado para o tipo de dicionário e o tipo de cadeia de caracteres, pois esses nomes de tipo não são qualificados por assembly.
Agora suponha que, em vez de System.String, o primeiro tipo de argumento genérico seja YourType, de YourAssembly:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Como esse assembly não é mscorlib.dll/System.Private.CoreLib.dll nem o assembly que está sendo executado atualmente, você não pode resolver YourType sem um nome qualificado por assembly. Como o seu assemblyResolve será chamado recursivamente, deve ser capaz de tratar esse caso. Em vez de retornar null para assemblies diferentes de MyAssembly, ele agora executa uma carga de assembly usando o objeto fornecido AssemblyName.
Type t2 = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :
Assembly.Load(aName),
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore), true
);
let t2 =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else Assembly.Load aName),
(fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr)), true)
Resolver nomes de tipo com caracteres especiais
Alguns caracteres têm significados especiais em nomes qualificados por assembly. Se um nome de tipo simples contiver esses caracteres, os caracteres causarão erros de análise quando o nome simples fizer parte de um nome qualificado por assembly. Para evitar os erros de análise, você deve escapar dos caracteres especiais com uma barra invertida antes de transmitir o nome qualificado por assembly para o método GetType. Por exemplo, se um tipo for nomeado Strange]Type, o caractere de escape deverá ser adicionado à frente do colchete da seguinte maneira: Strange\]Type.
Note
Nomes com esses caracteres especiais não podem ser criados no Visual Basic ou C#, mas podem ser criados usando CIL (linguagem intermediária comum) ou emitindo assemblies dinâmicos.
A tabela a seguir mostra os caracteres especiais para nomes de tipo.
| Character | Meaning |
|---|---|
, (vírgula) |
Delimitador para nomes qualificados por assembly. |
[] (colchetes) |
Como um par de sufixos, indica um tipo de matriz; como um par de delimitadores, delimita listas de argumentos genéricos e nomes qualificados por assembly. |
& (ampersand) |
Como sufixo, indica que um tipo é um tipo de referência. |
* (asterisco) |
Como sufixo, indica que um tipo é um tipo de ponteiro. |
+ (mais) |
Delimitador para tipos aninhados. |
\ (contrabarra) |
Caractere de escape. |
Propriedades como AssemblyQualifiedName retornam cadeias de caracteres com escape corretamente. Você deve transmitir corretamente as cadeias de caracteres com escape para o método GetType. Por sua vez, o método GetType transmite nomes com escape corretos para typeResolver e para os métodos de resolução de tipo padrão. Se você precisar comparar um nome com um nome sem escape em typeResolver, será necessário remover os caracteres de escape.
Resolução de nomes mistos
A tabela a seguir resume as interações entre assemblyResolver, typeResolver e a resolução de nomes padrão, para todas as combinações de nomes de tipo e de assembly em typeName:
| Conteúdo do nome do tipo | Método do resolvedor de assembly | Método de resolvedor de tipo | Result |
|---|---|---|---|
| tipo, montagem | nulo | nulo | Equivalente a chamar a sobrecarga do método Type.GetType(String, Boolean, Boolean). |
| tipo, montagem | fornecido | nulo |
assemblyResolver retornará o assembly ou retornará null se não puder resolver o assembly. Se o assembly for resolvido, a sobrecarga do método Assembly.GetType(String, Boolean, Boolean) será usada para carregar o tipo do assembly; caso contrário, não haverá nenhuma tentativa de resolver o tipo. |
| tipo, montagem | nulo | fornecido | Equivalente a converter o nome do assembly em um objeto AssemblyName e chamar a sobrecarga do método Assembly.Load(AssemblyName) para obter o assembly. Se o assembly for resolvido, ele será passado para typeResolver; caso contrário, typeResolver não será chamado e não haverá mais nenhuma tentativa de resolver o tipo. |
| tipo, montagem | fornecido | fornecido |
assemblyResolver retornará o assembly ou retornará null se não puder resolver o assembly. Se o assembly for resolvido, ele será passado para typeResolver; caso contrário, typeResolver não será chamado e não haverá mais nenhuma tentativa de resolver o tipo. |
| tipo | nulo, fornecido | nulo | Equivalente a chamar a sobrecarga do método Type.GetType(String, Boolean, Boolean). Como o nome do assembly não é fornecido, somente mscorlib.dll/System.Private.CoreLib.dll e o assembly em execução no momento são pesquisados. Se assemblyResolver for fornecido, será ignorado. |
| tipo | nulo, fornecido | fornecido |
typeResolver é chamado, e em seguida, null é transmitido para o assembly.
typeResolver pode fornecer um tipo de qualquer assembly, incluindo assemblies que carrega para esse propósito. Se assemblyResolver for fornecido, será ignorado. |
| assembly | nulo, fornecido | nulo, fornecido | Um FileLoadException é gerado, porque o nome do assembly é interpretado como se fosse um nome de tipo qualificado de assembly. Isso resulta em um nome de assembly inválido. |