<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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk