运行时动态访问类属性
面向对象编程中,属性为类及其成员提供额外的元数据。运行时检索属性值对于访问特定于类的信息或自定义行为非常有用。本文探讨一种在运行时读取分配给类的属性值的方法。
假设我们需要从“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中文网其他相关文章!