Akses dinamik kepada atribut kelas pada masa jalan
Dalam pengaturcaraan berorientasikan objek, atribut menyediakan metadata tambahan untuk kelas dan ahlinya. Mendapatkan semula nilai harta pada masa jalan adalah berguna untuk mengakses maklumat khusus kelas atau tingkah laku tersuai. Artikel ini meneroka cara untuk membaca nilai sifat yang diberikan kepada kelas semasa masa jalan.
Andaikan kita perlu mendapatkan sifat "DomainName" daripada kelas "MyClass". Atribut ini adalah jenis "DomainNameAttribute" dan mempunyai nilai "MyTable". Matlamatnya ialah untuk mencipta kaedah generik yang membaca sifat ini secara dinamik dan mengembalikan nilainya.
Untuk ini kita boleh memanfaatkan ciri pantulan .NET:
<code class="language-csharp">public string GetDomainName<T>() { var dnAttribute = typeof(T).GetCustomAttributes( typeof(DomainNameAttribute), true ).FirstOrDefault() as DomainNameAttribute; if (dnAttribute != null) { return dnAttribute.Name; } return null; }</code>
Dalam kod ini, kami menggunakan kaedah "GetCustomAttributes" untuk mendapatkan semula semua atribut jenis "DomainNameAttribute" daripada jenis yang ditentukan. Kami kemudian menghantar atribut pertama (dan biasanya sahaja) untuk menaip "DomainNameAttribute". Jika harta itu wujud, sifat "Nama"nya dikembalikan. Jika tidak, kembalikan null.
Menggunakan kaedah ini, kami boleh mendapatkan semula nilai sifat "DomainName" secara dinamik pada masa jalan:
<code class="language-csharp">// 这应该返回 "MyTable" String DomainNameValue = GetDomainName<MyClass>();</code>
Untuk menyamaratakan fungsi ini kepada mana-mana harta, kami boleh mencipta kaedah sambungan:
<code class="language-csharp">public static class AttributeExtensions { public static TValue GetAttributeValue<TAttribute, TValue>( this Type type, Func<TAttribute, TValue> valueSelector) where TAttribute : Attribute { var att = type.GetCustomAttributes( typeof(TAttribute), true ).FirstOrDefault() as TAttribute; if (att != null) { return valueSelector(att); } return default(TValue); } }</code>
Cara menggunakannya:
<code class="language-csharp">string name = typeof(MyClass) .GetAttributeValue((DomainNameAttribute dna) => dna.Name);</code>
Kaedah pelanjutan umum ini memberikan fleksibiliti untuk mengakses mana-mana harta yang dikaitkan dengan jenis, menjadikannya alat serba boleh untuk memeriksa sifat kelas pada masa jalan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Atribut Kelas Secara Dinamik dalam C# pada Runtime?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!