<Method> Element (.NET Native)

Menerapkan kebijakan refleksi runtime ke konstruktor atau metode.

Sintaks

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

Atribut dan Elemen

Bagian berikut menjelaskan atribut, elemen turunan, dan elemen induk.

Atribut

Atribut Jenis atribut Deskripsi
Name Umum Atribut yang diperlukan. Menentukan nama metode.
Signature Umum Atribut opsional. Menentukan tanda tangan metode. Jika ada beberapa parameter, parameter dipisahkan oleh koma. Misalnya, elemen berikut <Method> menentukan kebijakan untuk metode .ToString(String, IFormatProvider)

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

Jika atribut tidak ada, arahan runtime berlaku untuk semua kelebihan beban metode.
Browse Refleksi Atribut opsional. Mengontrol kueri untuk informasi tentang atau menghitung metode tetapi tidak mengaktifkan pemanggilan dinamis pada durasi.
Dynamic Refleksi Atribut opsional. Mengontrol akses runtime ke konstruktor atau metode untuk mengaktifkan pemrograman dinamis. Kebijakan ini memastikan bahwa anggota dapat dipanggil secara dinamis pada durasi.

Atribut nama

Nilai Deskripsi
method_name Nama metode. Jenis metode ditentukan oleh elemen Type> atau TypeInstantiation induk<.><

Atribut tanda tangan

Nilai Deskripsi
method_signature Jenis parameter yang membentuk tanda tangan metode. Beberapa parameter dipisahkan oleh koma, misalnya, "System.String,System.Int32,System.Int32)". Nama jenis parameter harus sepenuhnya memenuhi syarat.

Semua atribut lainnya

Nilai Deskripsi
policy_setting Pengaturan untuk diterapkan ke jenis kebijakan ini. Nilai yang mungkin adalah Auto, Excluded, Included, dan Required. Untuk informasi selengkapnya, lihat Pengaturan Kebijakan Arahan Runtime.

Elemen Anak

Elemen Deskripsi
<Parameter> Menerapkan kebijakan ke jenis argumen yang diteruskan ke metode .
<GenericParameter> Menerapkan kebijakan ke jenis parameter jenis atau metode generik.
<ImpliesType> Menerapkan kebijakan ke jenis, jika kebijakan tersebut telah diterapkan ke metode yang diwakili oleh elemen yang berisi <Method> .
<TypeParameter> Menerapkan kebijakan ke jenis yang diwakili oleh argumen yang Type diteruskan ke metode .

Elemen Induk

Elemen Deskripsi
<Jenis> Menerapkan kebijakan refleksi ke jenis dan semua anggotanya.
<TypeInstantiation> Menerapkan kebijakan refleksi ke jenis generik yang dibangun dan semua anggotanya.

Keterangan

<Method> Elemen metode generik menerapkan kebijakannya ke semua instansiasi yang tidak memiliki kebijakan sendiri.

Anda dapat menggunakan Signature atribut untuk menentukan kebijakan untuk metode tertentu yang kelebihan beban. Jika tidak, jika Signature atribut tidak ada, arahan runtime berlaku untuk semua kelebihan beban metode.

Anda tidak dapat menentukan kebijakan pantulan runtime untuk konstruktor dengan menggunakan <Method> elemen . Sebagai gantinya Activate , gunakan atribut <elemen Assembly>, <Namespace>, <Type>, atau <TypeInstantiation> .

Contoh

Metode Stringify dalam contoh berikut adalah metode pemformatan tujuan umum yang menggunakan pantulan untuk mengonversi objek ke representasi stringnya. Selain memanggil metode default ToString objek, metode ini dapat menghasilkan string hasil yang diformat dengan meneruskan metode objek ToString string format, IFormatProvider implementasi, atau keduanya. Ini juga dapat memanggil salah Convert.ToString satu kelebihan beban yang mengonversi angka ke representasi biner, heksadesimal, atau oktalnya.

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

Metode Stringify ini dapat dipanggil dengan kode seperti berikut:

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

Namun, ketika dikompilasi dengan .NET Native, contohnya dapat melemparkan sejumlah pengecualian pada waktu proses, termasuk NullReferenceException dan pengecualian MissingRuntimeArtifactException, Ini terjadi karena Stringify metode ini dimaksudkan terutama untuk mendukung pemformatan jenis primitif secara dinamis di Pustaka Kelas .NET Framework. Namun, metadata mereka tidak tersedia oleh file direktif default. Bahkan ketika metadata mereka tersedia, namun, contohnya melempar pengecualian MissingRuntimeArtifactException karena implementasi yang sesuai ToString belum disertakan dalam kode asli.

Semua pengecualian ini dapat dihilangkan dengan menggunakan <elemen Type> untuk menentukan jenis yang metadatanya harus ada, dan dengan menambahkan <Method> elemen untuk memastikan bahwa implementasi metode kelebihan beban yang dapat disebut secara dinamis juga ada. Berikut ini adalah file default.rd.xml yang menghilangkan pengecualian ini dan memungkinkan contoh untuk dijalankan tanpa kesalahan.

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

Lihat juga