面向对象编程中,属性是附加到类的元数据,提供了超出代码本身的额外信息。如果需要在运行时动态读取属性,以下是如何实现的。
领域属性示例
考虑以下包含DomainName
属性的代码片段:
<code class="language-csharp">[DomainName("MyTable")] public class MyClass : DomainBase { }</code>
用于属性读取的泛型方法
我们的目标是创建一个泛型方法,读取给定类上的DomainName
属性并返回其值:
<code class="language-csharp">string GetDomainName<T>() { var dnAttribute = typeof(T).GetCustomAttributes( typeof(DomainNameAttribute), true ).FirstOrDefault() as DomainNameAttribute; if (dnAttribute != null) { return dnAttribute.Name; } return null; }</code>
此方法可以这样使用:
<code class="language-csharp">string domainNameValue = GetDomainName<MyClass>(); // 返回 "MyTable"</code>
通用属性读取
使用AttributeExtensions
类,可以将属性读取功能泛化,使其能够与任何属性类型一起工作:
<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中文网其他相关文章!