Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# setting property values through reflection with attributes

Tags:

I am trying to build an object through an attribute on a classes property that specifies a column in a supplied data row that is the value of the property, as below:

    [StoredDataValue("guid")]
    public string Guid { get; protected set; }

    [StoredDataValue("PrograGuid")]
    public string ProgramGuid { get; protected set; }

In a Build() method on a base object, I am getting the attribute values set on these properties as

        MemberInfo info = GetType();
        object[] properties = info.GetCustomAttributes(true);

However, at this point I am realising the limitation in my knowledge.

For a start, I don't appear to be getting back the correct attributes.

And how do I set these properties through reflection, now that I have the attributes? Am I doing / thinking something fundamentally incorrect?

like image 773
johnc Avatar asked Dec 24 '08 01:12

johnc


1 Answers

There are a couple of separate issues here

  • typeof(MyClass).GetCustomAttributes(bool) (or GetType().GetCustomAttributes(bool)) returns the attributes on the class itself, not the attributes on members. You will have to invoke typeof(MyClass).GetProperties() to get a list of properties in the class, and then check each of them.

  • Once you got the property, I think you should use Attribute.GetCustomAttribute() instead of MemberInfo.GetGustomAttributes() since you exactly know what attribute you are looking for.

Here's a little code snippet to help you start:

PropertyInfo[] properties = typeof(MyClass).GetProperties();
foreach(PropertyInfo property in properties)
{
    StoredDataValueAttribute attribute =
        Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute;

    if (attribute != null) // This property has a StoredDataValueAttribute
    {
         property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes
    }
}

EDIT: Don't forget that Type.GetProperties() only returns public properties by default. You will have to use Type.GetProperties(BindingFlags) to get other sorts of properties as well.

like image 192
Tamas Czinege Avatar answered Sep 22 '22 08:09

Tamas Czinege