Exporter (0) Imprimer
Développer tout
Cet article a fait l'objet d'une traduction automatique. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
Traduction
Source

Type.GetType, méthode (String, Func<AssemblyName, Assembly>, Func<Assembly, String, Boolean, Type>, Boolean, Boolean)

Obtient le type portant le nom spécifié, en indiquant s'il faut effectuer une recherche qui respecte la casse et si une exception doit être levée si le type est introuvable, et éventuellement, en fournissant des méthodes personnalisées qui permettent de résoudre l'assembly et le type.

Espace de noms :  System
Assembly :  mscorlib (dans mscorlib.dll)

public static Type GetType(
	string typeName,
	Func<AssemblyName, Assembly> assemblyResolver,
	Func<Assembly, string, bool, Type> typeResolver,
	bool throwOnError,
	bool ignoreCase
)

Paramètres

typeName
Type : System.String
Nom du type à obtenir. Si le paramètre typeResolver est fourni, le nom de type peut être n'importe quelle chaîne pouvant être résolue par typeResolver. Si le paramètre assemblyResolver est fourni ou si la résolution de type standard est utilisée, typeName doit être un nom d'assembly complet (consultez AssemblyQualifiedName), à moins que le type ne se trouve dans l'assembly en cours d'exécution ou dans Mscorlib.dll, auquel cas, il suffit de fournir le nom de type qualifié par son espace de noms.
assemblyResolver
Type : System.Func<AssemblyName, Assembly>
Méthode que trouve et retourne l'assembly spécifié dans typeName. Le nom de l'assembly est passé à assemblyResolver en tant qu'objet AssemblyName. Si typeName ne contient pas le nom d'un assembly, assemblyResolver n'est pas appelé. Si assemblyResolver n'est pas fourni, une résolution d'assembly standard est effectuée.
Attention   Ne passez pas de méthodes provenant d'appelants inconnus ou non fiables. Vous risqueriez d'élever les privilèges du code malveillant. Utilisez uniquement les méthodes que vous fournissez ou avec lesquelles vous êtes familiarisé.
typeResolver
Type : System.Func<Assembly, String, Boolean, Type>
Méthode qui trouve et retourne le type spécifié par typeName à partir de l'assembly retourné par assemblyResolver ou par la résolution d'assembly standard. Si aucun assembly n'est fourni, la méthode peut en fournir un. La méthode prend également un paramètre qui spécifie s'il faut exécuter une recherche non sensible à la casse ; la valeur de ignoreCase est passé à ce paramètre.
Attention   Ne passez pas de méthodes provenant d'appelants inconnus ou non fiables.
throwOnError
Type : System.Boolean
true pour lever une exception si le type est introuvable ; false pour retourner null. false supprime également d'autres conditions d'exception, mais pas toutes. Consultez la section Exceptions.
ignoreCase
Type : System.Boolean
true pour effectuer une recherche qui ne respecte pas la casse de typeName et false pour effectuer une recherche qui respecte la casse de typeName.

Valeur de retour

Type : System.Type
Type portant le nom spécifié. Si le type est introuvable, le paramètre throwOnError spécifie si null est retourné ou bien une exception est levée. Dans certains cas, une exception est levée indépendamment de la valeur de throwOnError. Consultez la section Exceptions.

ExceptionCondition
ArgumentNullException

typeName a la valeur null.

TargetInvocationException

Un initialiseur de classe est appelé et lève une exception.

TypeLoadException

throwOnError a la valeur true et le type est introuvable.

ou

throwOnError a la valeur true et typeName contient caractères non valides, tels qu'une tabulation incorporée.

ou

throwOnError a la valeur true et typeName est une chaîne vide.

ou

throwOnError a la valeur true et typeName représente un type de tableau dont la taille est non valide.

ou

typeName représente un tableau de TypedReference.

ArgumentException

Une erreur se produit lorsque typeName est analysé dans un nom de type et un nom d'assembly (par exemple, lorsque le nom de type simple inclut un caractère spécial sans séquence d'échappement).

ou

throwOnError a la valeur true et typeName contient une syntaxe non valide (par exemple, "MyType[,*,]").

ou

typeName représente un type générique qui a un type pointeur, un type ByRef ou un type Void comme l'un de ses arguments de type.

ou

typeName représente un type générique qui a un nombre incorrect d'arguments de type.

ou

typeName représente un type générique, et l'un de ses arguments de type ne satisfait pas les contraintes spécifiées pour le paramètre de type correspondant.

FileNotFoundException

throwOnError a la valeur true et l'assembly ou l'une de ses dépendances est introuvable.

FileLoadException

L'assembly ou l'une de ses dépendances a été trouvé, mais n'a pas pu être chargé.

ou

typeName contient un nom d'assembly non valide.

ou

typeName est un nom d'assembly valide sans nom de type.

BadImageFormatException

L'assembly ou l'une de ses dépendances n'est pas valide.

ou

L'assembly a été compilé avec une version du Common Language Runtime ultérieure à la version actuellement chargée.

Utilisez cette surcharge de méthode et ses surcharges associées (GetType(String, Func<AssemblyName, Assembly>, Func<Assembly, String, Boolean, Type>) et GetType(String, Func<AssemblyName, Assembly>, Func<Assembly, String, Boolean, Type>, Boolean)) pour remplacer l'implémentation par défaut de la méthode GetType par des implémentations plus flexibles. En fournissant vos propres méthodes pour résoudre les noms des types et les noms des assemblys qui les contiennent, vous pouvez effectuer les opérations suivantes :

  • Contrôle depuis quelle version d'un assembly un type est chargé.

  • Fournissez un autre emplacement de recherche d'un nom de type qui n'inclut pas de nom d'assembly.

  • Chargez des assemblys à l'aide de noms d'assembly partiels.

  • Retournez les sous-classes de System.Type qui ne sont pas créées par le common language runtime (CLR).

Par exemple, avec la sérialisation avec tolérance de version, cette méthode vous permet de rechercher le « meilleur » assembly à l'aide d'un nom partiel. D'autres surcharges de la méthode GetType requièrent un nom de type qualifié d'assembly, qui inclut le numéro de version.

Les autres implémentations du système de type devront peut-être retourner des sous-classes de System.Type non créées par le CLR ; tous les types retournés par d'autres surcharges de la méthode GetType sont des types au moment de l'exécution.

Remarques sur l'utilisation

Cette surcharge de méthode et ses surcharges associées analysent typeName dans le nom d'un type et le nom d'un assembly, puis résolvent les noms. La résolution du nom de l'assembly se produit avant la résolution du nom de type, parce qu'un nom de type doit être résolu dans le contexte d'un assembly.

RemarqueRemarque

Si le concept de nom de type qualifié d'assembly ne vous est pas familier, consultez la propriété AssemblyQualifiedName.

Si typeName n'est pas un nom qualifié d'assembly, la résolution d'assembly est ignorée. Les noms de type non qualifiés peuvent être résolus dans le contexte de Mscorlib.dll ou de l'assembly en cours d'exécution, ou vous pouvez fournir éventuellement un assembly dans le paramètre typeResolver. Les effets dus à l'inclusion ou à l'omission du nom de l'assembly pour les différents types de résolution de noms sont affichés sous la forme d'un tableau dans la section traitant de la Résolution des noms mixtes.

Remarques d'utilisation générales :

  • Ne passez pas de méthodes à assemblyResolver ou typeResolver si elles proviennent d'appelants inconnus ou non fiables. Utilisez uniquement les méthodes que vous fournissez ou avec lesquelles vous êtes familiarisé.

    Mise en gardeAttention

    L'utilisation de méthodes d'appelants inconnus ou non fiables peut provoquer l'élévation de privilège pour le code malveillant.

  • Si vous omettez les paramètres assemblyResolver et/ou typeResolver, la valeur du paramètre throwOnError est passée aux méthodes qui exécutent la résolution par défaut.

  • Si throwOnError est true, cette méthode lève un TypeLoadException lorsque typeResolver retourne null, et un FileNotFoundException lorsque assemblyResolver retourne null.

  • Cette méthode n'intercepte pas d'exceptions levées par assemblyResolver et typeResolver. Vous êtes responsable de toutes les exceptions levées par les méthodes du programme de résolution.

Ee332784.collapse_all(fr-fr,VS.110).gifRésolution d'assemblys

La méthode assemblyResolver reçoit un objet AssemblyName, lequel est produit en analysant le nom de l'assembly de chaîne inclus dans typeName. Si typeName ne contient pas de nom d'assembly, assemblyResolver n'est pas appelé et null est passé à typeResolver.

Si assemblyResolver n'est pas fourni, une détection d'assembly standard est utilisée pour localiser l'assembly. Si assemblyResolver est fourni, la méthode GetType n'effectue pas la détection standard ; dans ce cas vous devez vérifier que votre assemblyResolver peut gérer tous les assemblys que vous lui passez.

La méthode assemblyResolver doit retourner null si l'assembly ne peut pas être résolu. Si assemblyResolver retourne null, typeResolver n'est pas appelé et aucun autre traitement ne se produit ; en outre, si throwOnError a la valeur true, une FileNotFoundException est levée.

Si le AssemblyName passé à assemblyResolver est un nom partiel, une ou plusieurs de ses parties sont null. Par exemple, s'il n'y a pas de version, la propriété Version est null. Si la propriété Version, la propriété CultureInfo et la méthode GetPublicKeyToken retournent toutes null, seul le nom simple de l'assembly a été fourni. La méthode assemblyResolver peut utiliser ou ignorer toutes les parties du nom de l'assembly.

Les effets des différentes options de résolution d'assembly sont affichés sous la forme d'un tableau dans la section traitant de la Résolution des noms mixtes, pour les noms de types simples et qualifiés d'assembly.

Ee332784.collapse_all(fr-fr,VS.110).gifRésolution de types

Si typeName ne spécifie pas de nom d'assembly, typeResolver est toujours appelé. Si typeName spécifie un nom d'assembly, typeResolver est appelé uniquement lorsque le nom de l'assembly est résolu avec succès. Si assemblyResolver ou la détection d'assembly standard retourne null, typeResolver n'est pas appelé.

La méthode typeResolver reçoit trois arguments :

  • L'assembly à rechercher ou null si typeName ne contient pas de nom d'assembly.

  • Nom simple du type. Dans le cas d'un type imbriqué, il s'agit du type conteneur le plus à l'extérieur. Dans le cas d'un type générique, il s'agit du nom simple du type générique.

  • Valeur booléenne avec la valeur true si le cas de noms de types doit être ignoré.

L'implémentation détermine la manière dont ces arguments sont utilisés. La méthode typeResolver doit retourner la valeur null si elle ne peut pas résoudre le type. Si typeResolver retourne null et throwOnError est true, cette surcharge de GetType lève une TypeLoadException.

Les effets des différentes options de résolution de type sont affichés sous la forme d'un tableau dans la section traitant de la Résolution des noms mixtes, pour les noms de types simples et qualifiés d'assembly.

Ee332784.collapse_all(fr-fr,VS.110).gifRésolution de types imbriqués

Si typeName est un type imbriqué, seul le nom du type conteneur le plus à l'extérieur est passé à typeResolver. Lorsque typeResolver retourne ce type, la méthode GetNestedType est appelée de manière récursive jusqu'à ce que le type imbriqué le plus profond ait été résolu.

Ee332784.collapse_all(fr-fr,VS.110).gifRésolution de types génériques

Le GetType est appelé de manière récursive pour résoudre les types génériques, tout d'abord pour résoudre le type générique proprement dit, puis pour résoudre ses arguments de type. Si un argument de type est générique, GetType est appelé de manière récursive pour résoudre ses arguments de type, et ainsi de suite.

La combinaison d'assemblyResolver et de typeResolver que vous fournissez doit être capable de résoudre tous les niveaux de cette récursivité. Par exemple, supposez que vous fournissez un assemblyResolver qui contrôle le chargement de MyAssembly. Supposons que vous souhaitiez résoudre le type générique Dictionary<string, MyType> (Dictionary(Of String, MyType) en Visual Basic). Vous pouvez passer le nom de type générique suivant :

"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"

Remarquez que MyType est le seul argument de type qualifié d'assembly. Les noms des classes String et Dictionary<TKey, TValue> ne sont pas qualifiés par un assembly. Votre typeResolver doit être en mesure de gérer un assembly ou null, car il recevra la valeur null pour Dictionary<TKey, TValue> et String. Il peut gérer ce cas en appelant une surcharge de la méthode GetType qui utilise une chaîne, parce que les deux noms de type non qualifiés sont dans Mscorlib.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)
                     ); 


La méthode assemblyResolver n'est pas appelée pour le type de dictionnaire et le type de chaîne, car ces noms de types ne sont pas des noms d'assemblys qualifiés.

Supposons maintenant qu'au lieu de System.String, le premier type d'argument générique est YourType, à partir de YourAssembly :

"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"

Étant donné que cet assembly n'est ni Mscorlib.dll, ni l'assembly actuellement exécuté, vous ne pouvez pas résoudre YourType sans un nom qualifié d'assembly. Étant donné que votre assemblyResolve sera appelé de manière récursive, il doit être en mesure de gérer ce cas. Au lieu de retourner null pour les assemblys autres que MyAssembly, il exécute maintenant un chargement de l'assembly à l'aide de l'objet AssemblyName fourni.


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
                      ); 


Retour aux Notes d'utilisation.

Ee332784.collapse_all(fr-fr,VS.110).gifRésolution de noms de type avec des caractères spéciaux

Certains caractères ont des significations spéciales dans les noms qualifiés d'assembly. Si un nom de type simple contient ces caractères, les caractères provoquent des erreurs d'analyse lorsque le nom simple fait partie d'un nom qualifié d'assembly. Pour éviter les erreurs d'analyse, vous devez placer les caractères spéciaux dans une séquence d'échappement à l'aide d'une barre oblique inverse avant de pouvoir passer le nom qualifié d'assembly à la méthode GetType. Par exemple, si un type est nommé Strange]Type, le caractère d'échappement doit être ajouté avant les crochets comme suit : Strange\]Type.

RemarqueRemarque

Les noms avec de tels caractères spéciaux ne peuvent pas être créés dans Visual Basic ou C#, mais peuvent être créés en utilisant le langage intermédiaire Microsoft (MSIL) ou en émettant des assemblys dynamiques.

Le tableau suivant affiche les caractères spéciaux pour les noms de type.

Caractère

Signification

, (virgule)

Délimiteur pour les noms qualifiés d'assembly.

[] (crochets)

En tant que paire de suffixes, indique un type de tableau ; en tant que paire de délimiteurs, joint des listes d'arguments génériques et des noms qualifiés d'assemblys.

et commercial (&)

En tant que suffixe, indique qu'un type est un type référence.

astérisque (*)

En tant que suffixe, indique qu'un type est un type pointeur.

+ (plus)

Délimiteur pour les types imbriqués.

barre oblique inverse (\)

Caractère d'échappement.

Les propriétés telles que AssemblyQualifiedName retournent des chaînes échappées correctement. Vous devez passer des chaînes correctement placées dans une séquence d'échappement à la méthode GetType. Ensuite, la méthode GetType passe correctement des noms d'échappement à typeResolver et aux méthodes de résolution de type par défaut. Si vous devez comparer un nom à un nom sans séquence d'échappement dans typeResolver, vous devez supprimer les caractères d'échappement.

Retour aux Notes d'utilisation.

Résolution de noms mixtes

Le tableau suivant résume les interactions entre assemblyResolver, typeResolver et la résolution de nom par défaut, pour toutes les combinaisons de nom de type et de nom d'assembly dans typeName :

Contenu du nom de type

Méthode de programme de résolution de l'assembly

Méthode du programme de résolution de type

Résultat

type, assembly

null

null

Cela équivaut à appeler la surcharge de méthode Type.GetType(String, Boolean, Boolean).

type, assembly

fourni

null

assemblyResolver retourne l'assembly ou retourne null s'il ne peut pas résoudre l'assembly. Si l'assembly est résolu, la surcharge de méthode Assembly.GetType(String, Boolean, Boolean) est utilisée pour charger le type à partir de l'assembly ; sinon, il n'y a aucune tentative de résoudre le type.

type, assembly

null

fourni

Équivalent à la conversion du nom de l'assembly en un objet AssemblyName et à l'appel de la surcharge de méthode Assembly.Load(AssemblyName) pour obtenir l'assembly. Si l'assembly est résolu, il est passé à typeResolver ; sinon, typeResolver n'est pas appelé et aucune autre tentative de résolution de type n'est effectuée.

type, assembly

fourni

fourni

assemblyResolver retourne l'assembly ou retourne null s'il ne peut pas résoudre l'assembly. Si l'assembly est résolu, il est passé à typeResolver ; sinon, typeResolver n'est pas appelé et aucune autre tentative de résolution de type n'est effectuée.

type

null, fourni

null

Cela équivaut à appeler la surcharge de méthode Type.GetType(String, Boolean, Boolean). Étant donné que le nom de l'assembly n'est pas fourni, seuls Mscorlib.dll et l'assembly actuellement exécuté sont recherchés. Si assemblyResolver est fourni, il est ignoré.

type

null, fourni

fourni

typeResolver est appelé, et null est passé pour l'assembly. typeResolver peut fournir un type à partir de n'importe quel assembly, notamment les assemblys qu'il charge à cette fin. Si assemblyResolver est fourni, il est ignoré.

assembly

null, fourni

null, fourni

Une FileLoadException est levée, parce que le nom de l'assembly est analysé comme s'il s'agissait d'un nom de type qualifié d'assembly. Il en résulte un nom d'assembly non valide.

Retour à : Notes d'utilisation, Résolution des assemblys, Résolution des types.

.NET Framework

Pris en charge dans : 4.5.2, 4.5.1, 4.5, 4

.NET Framework Client Profile

Pris en charge dans : 4

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (rôle principal du serveur non pris en charge), Windows Server 2008 R2 (rôle principal du serveur pris en charge avec SP1 ou version ultérieure ; Itanium non pris en charge)

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

Ajouts de la communauté

AJOUTER
Afficher:
© 2014 Microsoft