首页 >后端开发 >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