Elemento <Method> (.NET Native)<Method> Element (.NET Native)

Applica i criteri di reflection di runtime a un costruttore o a un metodo.Applies runtime reflection policy to a constructor or method.

SintassiSyntax

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

Attributi ed elementiAttributes and Elements

Nelle sezioni seguenti vengono descritti gli attributi, gli elementi figlio e gli elementi padre.The following sections describe attributes, child elements, and parent elements.

AttributiAttributes

AttributoAttribute Tipo di attributoAttribute type DescrizioneDescription
Name GeneraleGeneral Attributo obbligatorio.Required attribute. Specifica il nome del metodo.Specifies the method name.
Signature GeneraleGeneral Attributo facoltativo.Optional attribute. Specifica la firma del metodo.Specifies the method signature. Se esistono più parametri, sono separati da virgole.If multiple parameters are present, they are separated by commas. Ad esempio, l'elemento <Method> seguente definire i criteri del metodo ToString(String, IFormatProvider).For example, the following <Method> element defines policy for the ToString(String, IFormatProvider) method.

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

Se l'attributo è assente, la direttiva di runtime si applica a tutti gli overload del metodo.If the attribute is absent, the runtime directive applies to all overloads of the method.
Browse ReflectionReflection Attributo facoltativo.Optional attribute. Controlla l'esecuzione di query per informazioni sul metodo o la sua enumerazione, ma non abilita alcuna chiamata dinamica in fase di esecuzione.Controls querying for information about or enumerating a method but does not enable any dynamic invocation at run time.
Dynamic ReflectionReflection Attributo facoltativo.Optional attribute. Controlla l'accesso del runtime a un costruttore o al metodo per attivare la programmazione dinamica.Controls runtime access to a constructor or method to enable dynamic programming. Questo criterio assicura che un membro possa essere richiamato in modo dinamico in fase di esecuzione.This policy ensures that a member can be invoked dynamically at run time.

Name (attributo)Name attribute

ValoreValue DescrizioneDescription
method_namemethod_name Nome del metodo.The method name. Il tipo di metodo viene definito dall'elemento padre <Type> o <TypeInstantiation>.The type of the method is defined by the parent <Type> or <TypeInstantiation> element.

Attributo SignatureSignature attribute

ValoreValue DescrizioneDescription
method_signaturemethod_signature Tipi di parametri che costituiscono la firma del metodo.The parameter types that form the method signature. Più parametri sono separati da virgole, ad esempio "System.String,System.Int32,System.Int32)".Multiple parameters are separated by commas, for example, "System.String,System.Int32,System.Int32)". I nomi del tipo di parametro devono essere completi.Parameter type names should be fully qualified.

Tutti gli altri attributiAll other attributes

ValoreValue DescrizioneDescription
policy_settingpolicy_setting L'impostazione da applicare a questo tipo di criteri.The setting to apply to this policy type. I valori consentiti sono Auto, Excluded, Included e Required.Possible values are Auto, Excluded, Included, and Required. Per altre informazioni, vedere Runtime Directive Policy Settings (Impostazioni dei criteri delle direttive di runtime).For more information, see Runtime Directive Policy Settings.

Elementi figlioChild Elements

ElementoElement DescrizioneDescription
<Parameter><Parameter> Applica i criteri al tipo di argomento passato a un metodo.Applies policy to the type of the argument passed to a method.
<GenericParameter><GenericParameter> Applica i criteri al tipo di parametro di un tipo o di un metodo generico.Applies policy to the parameter type of a generic type or method.
<ImpliesType><ImpliesType> Applica criteri a un tipo, se tale criterio è stato applicato al metodo rappresentato dall'oggetto contenente l'elemento <Method>.Applies policy to a type, if that policy has been applied to the method represented by the containing <Method> element.
<TypeParameter><TypeParameter> Applica i criteri al tipo rappresentato da un argomento Type passato a un metodo.Applies policy to the type represented by a Type argument passed to a method.

Elementi padreParent Elements

ElementoElement DescrizioneDescription
<Type><Type> Applica i criteri di reflection a un tipo e a tutti i membri.Applies reflection policy to a type and all its members.
<TypeInstantiation><TypeInstantiation> Applica i criteri di reflection a un tipo generico costruito e a tutti i membri.Applies reflection policy to a constructed generic type and all its members.

NoteRemarks

Un elemento <Method> di un metodo generico applica i relativi criteri a tutte le istanze che non dispongono di propri criteri.A <Method> element of a generic method applies its policy to all instantiations that do not have their own policy.

È possibile usare l'attributo Signature per specificare criteri per un overload del metodo specifico.You can use the Signature attribute to specify policy for a particular method overload. In caso contrario, se l'attributo Signature è assente, la direttiva di runtime si applica a tutti gli overload del metodo.Otherwise, if the Signature attribute is absent, the runtime directive applies to all overloads of the method.

Non è possibile definire i criteri di reflection di runtime per un costruttore con l'elemento <Method>.You cannot define the runtime reflection policy for a constructor by using the <Method> element. Usare invece l'attributo Activate dell'elemento <Assembly>, <Namespace>, <Type> o <TypeInstantiation>.Instead, use the Activate attribute of the <Assembly>, <Namespace>, <Type>, or <TypeInstantiation> element.

EsempioExample

Il metodo Stringify nell'esempio seguente è un metodo di formattazione generico che usa la reflection per convertire un oggetto nella relativa rappresentazione di stringa.The Stringify method in the following example is a general-purpose formatting method that uses reflection to convert an object to its string representation. Oltre a chiamare il metodo ToString predefinito dell'oggetto, il metodo può produrre una stringa di risultato formattata passando il metodo ToString di un oggetto a una stringa di formato, un'implementazione di IFormatProvider o entrambi.In addition to calling the object's default ToString method, the method can produce a formatted result string by passing an object's ToString method a format string, an IFormatProvider implementation, or both. Il metodo può anche chiamare uno degli overload Convert.ToString che converte un numero nella relativa rappresentazione binaria, ottale o esadecimale.It can also call one of the Convert.ToString overloads that converts a number to its binary, hexadecimal, or octal representation.

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

Il metodo Stringify può essere chiamato da codice simile al seguente:The Stringify method can be called by code like the following:

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

Tuttavia, quando viene compilato con .NET Native, l'esempio può generare una serie di eccezioni in fase di esecuzione, incluse le eccezioni NullReferenceException e MissingRuntimeArtifactException. Ciò si verifica perché il metodo Stringify è destinato principalmente a supportare la formattazione dinamica dei tipi primitivi nella libreria di classi .NET Framework.However, when compiled with .NET Native, the example can throw an number of exceptions at runtime, including NullReferenceException and MissingRuntimeArtifactException exceptions, This occurs because the Stringify method is intended primarily to support dynamically formatting the primitive types in the .NET Framework Class Library. Tuttavia, i metadati non vengono resi disponibili dal file di direttive predefinito.However, their metadata is not made available by the default directives file. Anche quando i metadati vengono resi disponibili, tuttavia, l'esempio genererà le eccezioni MissingRuntimeArtifactException perché le implementazioni ToString appropriate non sono state incluse nel codice nativo.Even when their metadata is made available, however, the example throws MissingRuntimeArtifactException exceptions because the appropriate ToString implementations have not been include in the native code.

Queste eccezioni possono essere eliminate usando l'elemento <Type> per definire i tipi i cui metadati devono essere presenti e con l'aggiunta di elementi <Method> per garantire anche la presenza dell'implementazione degli overload di metodi che possono essere richiamati in modo dinamico.These exceptions can all be eliminated by using the <Type> element to define the types whose metadata must be present, and by adding <Method> elements to ensure that the implementation of method overloads that can be called dynamically is also present. Di seguito è riportato il file default.rd.xml che elimina queste eccezioni e consente l'esecuzione dell'esempio senza errori.The following is the default.rd.xml file that eliminates these exceptions and allows the example to execute without error.

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

Vedere ancheSee Also

Informazioni di riferimento sul file di configurazione delle direttive di runtime (rd.xml)Runtime Directives (rd.xml) Configuration File Reference
Elementi direttiva di runtimeRuntime Directive Elements
Impostazioni dei criteri delle direttive di runtimeRuntime Directive Policy Settings
Elemento <MethodInstantiation><MethodInstantiation> Element