首頁 >後端開發 >C++ >如何在運行時動態檢索類別的屬性值?

如何在運行時動態檢索類別的屬性值?

Linda Hamilton
Linda Hamilton原創
2025-01-12 06:04:12897瀏覽

How Can I Dynamically Retrieve Attribute Values from a Class at Runtime?

運行時檢索屬性

本文介紹一種通用的方法,用於動態存取和提取類別的屬性值。

使用專用方法

定義一個接受型別參數的通用方法:

<code class="language-csharp">public string GetDomainName<T>()</code>

方法內部:

  • 使用 typeof(T).GetCustomAttributes 檢索自訂屬性:

    <code class="language-csharp">  var dnAttribute = typeof(T).GetCustomAttributes(
        typeof(DomainNameAttribute), true
      ).FirstOrDefault() as DomainNameAttribute;</code>
  • 如果屬性存在,則傳回其值:

    <code class="language-csharp">  if (dnAttribute != null)
      {
        return dnAttribute.Name;
      }</code>
  • 否則,回傳 null:

    <code class="language-csharp">  return null;</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
}</code>

擴充方法內部:

  • 擷取自訂屬性:

    <code class="language-csharp">  var att = type.GetCustomAttributes(
        typeof(TAttribute), true
      ).FirstOrDefault() as TAttribute;</code>
  • 如果屬性存在,則使用提供的 valueSelector 來提取所需的值:

    <code class="language-csharp">  if (att != null)
      {
        return valueSelector(att);
      }</code>
  • 否則,傳回該類型的預設值:

    <code class="language-csharp">  return default(TValue);</code>

使用範例

  • 檢索 MyClassDomainName 屬性:
<code class="language-csharp">string name = typeof(MyClass).GetDomainName<MyClass>();</code>
  • 使用擴充方法檢索 MyClass 的任何屬性值:
<code class="language-csharp">string name = typeof(MyClass)
    .GetAttributeValue<DomainNameAttribute, string>((DomainNameAttribute dna) => dna.Name);</code>

以上是如何在運行時動態檢索類別的屬性值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn