運行時動態存取類別屬性
物件導向程式設計中,屬性為類別及其成員提供額外的元資料。運行時檢索屬性值對於存取特定於類別的資訊或自訂行為非常有用。本文探討一種在運行時讀取分配給類別的屬性值的方法。
假設我們需要從「MyClass」類別取得「DomainName」屬性。此屬性屬於「DomainNameAttribute」類型,其值為「MyTable」。目標是建立一個泛型方法,動態讀取此屬性並傳回其值。
為此,我們可以利用.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>
在此程式碼中,我們使用「GetCustomAttributes」方法從指定的類型中擷取所有「DomainNameAttribute」類型的屬性。然後,我們將第一個(通常也是唯一一個)屬性強制轉換為「DomainNameAttribute」類型。如果屬性存在,則傳回其「Name」屬性。否則,返回null。
使用此方法,我們可以動態擷取執行階段的「DomainName」屬性值:
<code class="language-csharp">// 这应该返回 "MyTable" String DomainNameValue = GetDomainName<MyClass>();</code>
為了將此功能推廣到任何屬性,我們可以建立一個擴充方法:
<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>
使用方法如下:
<code class="language-csharp">string name = typeof(MyClass) .GetAttributeValue((DomainNameAttribute dna) => dna.Name);</code>
此泛化的擴充方法提供了存取與類型關聯的任何屬性的靈活性,使其成為運行時檢查類別屬性的通用工具。
以上是如何在運行時動態存取 C# 中的類別屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!