Is it possible to add attributes to a property of dynamic object runtime?

Tomas Jansson picture Tomas Jansson · Dec 11, 2013 · Viewed 7.8k times · Source

I want to add an attribute to property of a dynamic object/expando object runtime, is it possible?

What I would like to do is:

dynamic myExpando = new ExpandoObject();
myExpando.SomeProp = "string";
myExpando.AddAttribute("SomeProp", new MyAttribute());

Is it possible to do that in one way or another?

Answer

Bura Chuhadar picture Bura Chuhadar · Dec 11, 2013

You can add an attribute to a dynamic object like this:

 dynamic myExpando = new ExpandoObject();
            myExpando.SomeProp = "string";
            TypeDescriptor.AddAttributes(myExpando, new SerializableAttribute());

To read the attributes you should use this:

 dynamic values = TypeDescriptor.GetAttributes(myExpando);
            for (int i = 0; i < values.Count; i++)
            {
                System.Console.WriteLine(values[i]);
            }

I am not sure you can read custom attributes like that. However you can also try reflection:

 System.Reflection.MemberInfo info = myExpando.GetType();
            object[] attributes = info.GetCustomAttributes(true);
            for (int i = 0; i < attributes.Length; i++)
            {
                System.Console.WriteLine(attributes[i]);
            }

However, with reflection you cannot see the attribute that you have been added because attributes are static metadata.

TypeDescriptor is a metadata engine provided by the .NET FCL. You can read the article here:

http://blogs.msdn.com/b/parthopdas/archive/2006/01/03/509103.aspx