Partager via


<Method> , élément (.NET Native)

Applique une stratégie de réflexion runtime à un constructeur ou à une méthode.

Syntaxe

<Method Name="method_name"
        Signature="method_signature"
        Browse="policy_type"
        Dynamic="policy_type" />

Attributs et éléments

Les sections suivantes décrivent des attributs, des éléments enfants et des éléments parents.

Attributs

Attribut Type d'attribut Description
Name Généralités Attribut requis. Spécifie le nom de la méthode.
Signature Général Attribut facultatif. Spécifie la signature de la méthode. Si plusieurs paramètres sont présents, ils sont séparés par des virgules. Par exemple, l'élément <Method> suivant définit la stratégie pour la méthode ToString(String, IFormatProvider).

<Type Name="System.DateTime"> <Method Name="ToString" Signature="System.String,System.IFormatProvider" Dynamic="Required" /> </Type>

Si l'attribut est absent, la directive runtime s'applique à toutes les surcharges de la méthode.
Browse Réflexion Attribut facultatif. Contrôle la demande d'informations sur une méthode ou l'énumération de celle-ci, mais ne permet pas d'effectuer un appel dynamique au moment de l'exécution.
Dynamic Réflexion Attribut facultatif. Contrôle l'accès à un constructeur ou à une méthode au moment de l'exécution pour activer la programmation dynamique. Cette stratégie garantit que le membre peut être appelé dynamiquement au moment de l'exécution.

Name (attribut)

Valeur Description
method_name Nom de la méthode. Le type de la méthode est défini par l’élément Type> parent <ou< TypeInstantiation.>

Attribut de signature

Valeur Description
signature_méthode Types de paramètre qui constituent la signature de la méthode. Si plusieurs paramètres sont présents, ils sont séparés par des virgules. Par exemple : "System.String,System.Int32,System.Int32)". Les noms de type de paramètre doivent être qualifiés complets.

Tous les autres attributs

Valeur Description
policy_setting Paramètre à appliquer à ce type de stratégie. Les valeurs possibles sont Auto, Excluded, Included et Required. Pour plus d’informations, consultez Paramètres de stratégie de directive runtime.

Éléments enfants

Élément Description
<Paramètre> Applique la stratégie au type de l'argument passé à une méthode.
<GenericParameter> Applique la stratégie au type de paramètre d'un type ou d'une méthode générique.
<ImpliesType> Applique la stratégie à un type, si cette stratégie a été appliquée à la méthode représentée par l'élément <Method> conteneur.
<TypeParameter> Applique la stratégie au type représenté par un argument Type passé à une méthode.

Éléments parents

Élément Description
<Type> Applique la stratégie de réflexion à un type et à tous ses membres.
<TypeInstantiation> Applique la stratégie de réflexion à un type générique construit et à tous ses membres.

Notes

Un élément <Method> d'une méthode générique applique sa stratégie à toutes les instanciations qui n'ont pas leur propre stratégie.

Vous pouvez utiliser l'attribut Signature pour spécifier la stratégie d'une surcharge de méthode particulière. Sinon, si l'attribut Signature est absent, la directive runtime s'applique à toutes les surcharges de la méthode.

Vous ne pouvez pas définir la stratégie de réflexion runtime d'un constructeur à l'aide de l'élément <Method>. Utilisez plutôt l’attribut Activate de l’élément< Assembly>,< Namespace>, <Type> ou <TypeInstantiation.>

Exemple

La méthode Stringify dans l'exemple suivant est une méthode de mise en forme à usage général qui utilise la réflexion pour convertir un objet sous forme de chaîne. En plus d'appeler la méthode ToString par défaut de l'objet, la méthode peut produire une chaîne de résultat mise en forme en passant à la méthode ToString d'un objet une chaîne de format et/ou une implémentation IFormatProvider. Elle peut également appeler l'une des surcharges Convert.ToString qui convertit un nombre au format binaire, hexadécimale ou octale.

public class Stringify
{
   public static string ConvertToString(Object[] obj)
   {
      if (obj == null)
         throw new NullReferenceException("The obj parameter cannot be null.");

      if (obj.Length == 0) return String.Empty;

      if (obj[0].GetType() == typeof(String))
         return obj[0] as string;

      if (obj.Length == 1) return obj[0].ToString();

      if (obj.Length > 3)
         throw new ArgumentOutOfRangeException("The array can have from zero to three elements.");

      string retval = "";

      // Parameters indicate either a format specifier, numeric base, or format provider,
      // or a format specifier with an IFormatProvider.

      // A string as the first parameter indicates a format specifier.
      if (obj[1].GetType() == typeof(String)) {
         Type t = obj[0].GetType();
         if (obj.Length == 2)
         {
            MethodInfo m = t.GetRuntimeMethod("ToString", new Type[] { typeof(String) });
            retval = m.Invoke(obj[0], new object[] { obj[1] }).ToString();
         }
         else
         {
             MethodInfo m = t.GetRuntimeMethod("ToString", new Type[] { typeof(String), obj[2].GetType() });
             retval = m.Invoke(obj[0], new object[] { obj[1], obj[2] }).ToString();
         }
      }
      else if (obj[1] is IFormatProvider)
      {
          Type t = obj[0].GetType();
          MethodInfo m = t.GetRuntimeMethod("ToString", new Type[] { obj[1].GetType() } );
          retval = m.Invoke(obj[0], new object[] { obj[1] }).ToString();
      }
      // The second parameter is a base, so call Convert.ToString(number, int).
      else {
          Type t = typeof(Convert);
          MethodInfo m = t.GetRuntimeMethod("ToString", new Type[] { obj[0].GetType(), obj[1].GetType() } );
          retval = m.Invoke(null, obj).ToString();
      }
      return retval;
   }
}

La méthode Stringify peut être appelée par du code comme suit :

public class Stringify
{
   public static string ConvertToString(Object[] obj)
   {
      if (obj == null)
         throw new NullReferenceException("The obj parameter cannot be null.");

      if (obj.Length == 0) return String.Empty;

      if (obj[0].GetType() == typeof(String))
         return obj[0] as string;

      if (obj.Length == 1) return obj[0].ToString();

      if (obj.Length > 3)
         throw new ArgumentOutOfRangeException("The array can have from zero to three elements.");

      string retval = "";

      // Parameters indicate either a format specifier, numeric base, or format provider,
      // or a format specifier with an IFormatProvider.

      // A string as the first parameter indicates a format specifier.
      if (obj[1].GetType() == typeof(String)) {
         Type t = obj[0].GetType();
         if (obj.Length == 2)
         {
            MethodInfo m = t.GetRuntimeMethod("ToString", new Type[] { typeof(String) });
            retval = m.Invoke(obj[0], new object[] { obj[1] }).ToString();
         }
         else
         {
             MethodInfo m = t.GetRuntimeMethod("ToString", new Type[] { typeof(String), obj[2].GetType() });
             retval = m.Invoke(obj[0], new object[] { obj[1], obj[2] }).ToString();
         }
      }
      else if (obj[1] is IFormatProvider)
      {
          Type t = obj[0].GetType();
          MethodInfo m = t.GetRuntimeMethod("ToString", new Type[] { obj[1].GetType() } );
          retval = m.Invoke(obj[0], new object[] { obj[1] }).ToString();
      }
      // The second parameter is a base, so call Convert.ToString(number, int).
      else {
          Type t = typeof(Convert);
          MethodInfo m = t.GetRuntimeMethod("ToString", new Type[] { obj[0].GetType(), obj[1].GetType() } );
          retval = m.Invoke(null, obj).ToString();
      }
      return retval;
   }
}

Toutefois, lorsqu’elle est compilée avec .NET Native, l’exemple peut lever un certain nombre d’exceptions au moment de l’exécution, y compris NullReferenceException et missingRuntimeArtifactException , car la Stringify méthode est destinée principalement à prendre en charge la mise en forme dynamique des types primitifs dans la bibliothèque de classes .NET Framework. Cependant, leurs métadonnées ne sont pas rendues disponibles par le fichier de directives par défaut. Toutefois, même quand leurs métadonnées sont rendues disponibles, l’exemple lève des exceptions MissingRuntimeArtifactException, car les implémentations ToString appropriées n’ont pas été incluses dans le code natif.

Ces exceptions peuvent toutes être éliminées à l’aide de l’élément <Type> pour définir les types dont les métadonnées doivent être présentes et en ajoutant <Method> des éléments pour vous assurer que l’implémentation des surcharges de méthode qui peuvent être appelées dynamiquement est également présente. Voici le fichier default.rd.xml qui élimine ces exceptions et qui permet à l'exemple de s'exécuter sans erreur.

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
     <Assembly Name="*Application*" Dynamic="Required All" />

     <Type Name = "System.Convert" Browse="Required Public" Dynamic="Required Public" >
        <Method Name="ToString"    Dynamic ="Required" />
     </Type>
     <Type Name="System.Double" Browse="Required Public">
        <Method Name="ToString" Dynamic="Required" />
     </Type>
     <Type Name ="System.Int32" Browse="Required Public" >
        <Method Name="ToString" Dynamic="Required" />
     </Type>
     <Type Name ="System.Int64" Browse="Required Public" >
        <Method Name="ToString" Dynamic="Required" />
     </Type>
     <Namespace Name="System" >
        <Type Name="Byte" Browse="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="DateTime" Browse="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="Decimal" Browse="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="Guid" Browse ="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="Int16" Browse="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="SByte" Browse="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="Single" Browse="Required Public" >
          <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="TimeSpan" Browse="Required Public" >
          <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="UInt16" Browse="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="UInt32" Browse="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
        <Type Name="UInt64" Browse="Required Public" >
           <Method Name="ToString" Dynamic="Required" />
        </Type>
     </Namespace>
  </Application>
</Directives>

Voir aussi