Bagikan melalui


Mengakses atribut kustom

Setelah atribut dikaitkan dengan elemen program, pantulan dapat digunakan untuk mengkueri 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 langsung konstruktor mereka. Untuk memuat dan memeriksa atribut kustom dalam MetadataLoadContext konteks, gunakan CustomAttributeData kelas . Anda dapat memperoleh instans kelas ini dengan menggunakan kelebihan beban yang sesuai dari metode statis CustomAttributeData.GetCustomAttributes . Untuk informasi selengkapnya, lihat Cara: Memeriksa konten rakitan menggunakan MetadataLoadContext.

Konteks eksekusi

Metode refleksi utama untuk mengkueri atribut dalam konteks eksekusi adalah MemberInfo.GetCustomAttributes dan Attribute.GetCustomAttributes.

Aksesibilitas atribut kustom diperiksa sehubungan dengan perakitan tempat atribut tersebut dilampirkan. Ini setara dengan memeriksa apakah suatu metode pada tipe dalam assembly tempat atribut kustom dilampirkan dapat memanggil konstruktor dari atribut kustom tersebut.

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 kustom yang khas. Ini mengilustrasikan model refleksi atribut khusus waktu proses.

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 tipe atribut kustom publik DescriptionAttribute yang dilampirkan ke metode GetLanguage, runtime melakukan tindakan berikut:

  1. Runtime memeriksa bahwa argumen jenis DescriptionAttribute untuk Type.GetCustomAttributes(Type type) bersifat publik, dan oleh karena itu terlihat dan dapat diakses.
  2. Runtime memeriksa bahwa tipe MyDescriptionAttribute yang ditentukan pengguna dan diturunkan dari DescriptionAttribute terlihat dan dapat diakses dalam rakitan System.Web.dll, di mana tipe tersebut ditautkan pada metode GetLanguage().
  3. Runtime memeriksa bahwa konstruktor MyDescriptionAttribute terlihat dan dapat diakses di dalam assembly System.Web.dll.
  4. Runtime memanggil konstruktor MyDescriptionAttribute dengan parameter atribut kustom dan mengembalikan objek baru ke pemanggil.

Model refleksi atribut kustom dapat membocorkan instans tipe yang didefinisikan pengguna di luar rakitan di mana tipe tersebut didefinisikan. Ini tidak berbeda dengan anggota di pustaka sistem runtime yang mengembalikan instans jenis yang ditentukan pengguna, seperti Type.GetMethods mengembalikan array objek RuntimeMethodInfo. Untuk mencegah klien menemukan informasi tentang jenis atribut kustom yang ditentukan pengguna, tentukan anggota jenis menjadi nonpublik.

Contoh berikut menunjukkan cara dasar penggunaan pantulan untuk mendapatkan akses ke atribut kustom.

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