一尘不染

如何在运行时读取类的属性?

c#

我试图创建一个通用方法,该方法将读取类的属性并在运行时返回该值。我该怎么做?

注意:DomainName属性属于DomainNameAttribute类。

[DomainName("MyTable")]
Public class MyClass : DomainBase
{}

我试图产生的是:

//This should return "MyTable"
String DomainNameValue = GetDomainName<MyClass>();

阅读 202

收藏
2020-05-19

共1个答案

一尘不染

public string GetDomainName<T>()
{
    var dnAttribute = typeof(T).GetCustomAttributes(
        typeof(DomainNameAttribute), true
    ).FirstOrDefault() as DomainNameAttribute;
    if (dnAttribute != null)
    {
        return dnAttribute.Name;
    }
    return null;
}

更新:

可以进一步推广此方法以使用任何属性:

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);
    }
}

并像这样使用:

string name = typeof(MyClass)
    .GetAttributeValue((DomainNameAttribute dna) => dna.Name);
2020-05-19