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?
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