Mengakses atribut kustom
Setelah atribut dikaitkan dengan elemen program, refleksi dapat digunakan untuk menanyakan keberadaan dan nilainya. .NET menyediakan MetadataLoadContext, yang dapat Anda gunakan untuk memeriksa kode yang tidak dapat dimuat untuk eksekusi.
MetadataLoadContext
Kode yang dimuat ke MetadataLoadContext dalam konteks tidak dapat dijalankan. Ini berarti bahwa instans atribut kustom tidak dapat dibuat, karena itu akan memerlukan eksekusi konstruktornya. Untuk memuat dan memeriksa atribut kustom dalam MetadataLoadContext konteks, gunakan CustomAttributeData kelas . Anda dapat memperoleh instans kelas ini dengan menggunakan kelebihan yang sesuai dari metode statis CustomAttributeData.GetCustomAttributes. Untuk informasi selengkapnya, lihat Cara: Memeriksa konten rakitan menggunakan MetadataLoadContext.
Konteks eksekusi
Metode refleksi utama untuk atribut kueri dalam konteks eksekusi adalah MemberInfo.GetCustomAttributes dan Attribute.GetCustomAttributes.
Aksesibilitas atribut kustom diperiksa sehubungan dengan assembly tempat atribut tersebut dilampirkan. Upaya ini sama dengan memeriksa apakah suatu metode pada jenis di rakitan ketika atribut khusus dilampirkan dapat memanggil konstruktor dari atribut khusus.
Metode seperti Assembly.GetCustomAttributes(Boolean) memeriksa visibilitas dan aksesibilitas argumen jenis. Hanya kode dalam rakitan yang berisi jenis yang ditentukan pengguna yang dapat mengambil atribut kustom dari jenis tersebut menggunakan GetCustomAttributes
.
Contoh C# berikut adalah pola desain atribut khusus yang khas. Contoh ini menggambarkan model refleksi atribut kustom runtime.
System.DLL
public class DescriptionAttribute : Attribute
{
}
System.Web.DLL
internal class MyDescriptionAttribute : DescriptionAttribute
{
}
public class LocalizationExtenderProvider
{
[MyDescriptionAttribute(...)]
public CultureInfo GetLanguage(...)
{
}
}
Jika runtime mencoba mengambil atribut kustom untuk jenis DescriptionAttribute atribut kustom publik yang dilampirkan ke GetLanguage
metode , runtime melakukan tindakan berikut:
- Runtime memeriksa bahwa argumen
DescriptionAttribute
Type.GetCustomAttributes(Type type)
jenis bersifat publik, dan oleh karena itu terlihat dan dapat diakses. - Runtime memeriksa bahwa jenis
MyDescriptionAttribute
yang ditentukan pengguna yang berasal dariDescriptionAttribute
terlihat dan dapat diakses dalam rakitan System.Web.dll, di mana jenis tersebut melekat pada metodeGetLanguage()
. - Runtime memeriksa bahwa konstruktor
MyDescriptionAttribute
terlihat dan dapat diakses dalam rakitan System.Web.dll. - Runtime memanggil konstruktor
MyDescriptionAttribute
dengan parameter atribut kustom dan mengembalikan objek baru ke pemanggil.
Model refleksi atribut kustom dapat membocorkan instans jenis yang ditentukan pengguna di luar rakitan tempat jenis tersebut ditentukan. Ini tidak berbeda dengan anggota di pustaka sistem runtime yang mengembalikan instans jenis yang ditentukan pengguna, seperti Type.GetMethods mengembalikan array RuntimeMethodInfo
objek. Untuk mencegah klien menemukan informasi tentang jenis atribut khusus yang ditentukan pengguna, tentukan anggota jenis tersebut menjadi nonpublik.
Contoh berikut menunjukkan cara dasar menggunakan refleksi untuk mendapatkan akses ke atribut khusus.
using namespace System;
public ref class ExampleAttribute : Attribute
{
private:
String^ stringVal;
public:
ExampleAttribute()
{
stringVal = "This is the default string.";
}
property String^ StringValue
{
String^ get() { return stringVal; }
void set(String^ value) { stringVal = value; }
}
};
[Example(StringValue="This is a string.")]
public ref class Class1
{
public:
static void Main()
{
System::Reflection::MemberInfo^ info = Type::GetType("Class1");
for each (Object^ attrib in info->GetCustomAttributes(true))
{
Console::WriteLine(attrib);
}
}
};
int main()
{
Class1::Main();
}
using System;
public class ExampleAttribute : Attribute
{
private string stringVal;
public ExampleAttribute()
{
stringVal = "This is the default string.";
}
public string StringValue
{
get { return stringVal; }
set { stringVal = value; }
}
}
[Example(StringValue="This is a string.")]
class Class1
{
public static void Main()
{
System.Reflection.MemberInfo info = typeof(Class1);
foreach (object attrib in info.GetCustomAttributes(true))
{
Console.WriteLine(attrib);
}
}
}
Public Class ExampleAttribute
Inherits Attribute
Private stringVal As String
Public Sub New()
stringVal = "This is the default string."
End Sub
Public Property StringValue() As String
Get
Return stringVal
End Get
Set(Value As String)
stringVal = Value
End Set
End Property
End Class
<Example(StringValue:="This is a string.")> _
Class Class1
Public Shared Sub Main()
Dim info As System.Reflection.MemberInfo = GetType(Class1)
For Each attrib As Object In info.GetCustomAttributes(true)
Console.WriteLine(attrib)
Next attrib
End Sub
End Class
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