How do I read an attribute on a class at runtime?

Zaffiro picture Zaffiro · Apr 16, 2010 · Viewed 120.2k times · Source

I am trying to create a generic method that will read an attribute on a class and return that value at runtime. How do would I do this?

Note: DomainName attribute is of class DomainNameAttribute.

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

What I am trying to generate:

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

Answer

Darin Dimitrov picture Darin Dimitrov · Apr 16, 2010
public string GetDomainName<T>()
{
    var dnAttribute = typeof(T).GetCustomAttributes(
        typeof(DomainNameAttribute), true
    ).FirstOrDefault() as DomainNameAttribute;
    if (dnAttribute != null)
    {
        return dnAttribute.Name;
    }
    return null;
}

UPDATE:

This method could be further generalized to work with any attribute:

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

and use like this:

string name = typeof(MyClass)
    .GetAttributeValue((DomainNameAttribute dna) => dna.Name);