Add property to ExpandoObject with the same name as a string
Asked Answered
O

2

33

Is there a way to add a property to an ExpandoObject with the same name as a string value?

For example, if I have:

string propName = "ProductNumber";
dynamic obj = new System.Dynamic.ExpandoObject();

I can create the property ProductNumber like:

obj.ProductNumber = 123;

But, can I create the property obj.ProductNumber based on the string propName? So, if I don't know what the name of the property will be in advanced, I can create it based on this input. If this is not possible with ExpandoObject, any other areas of C# I should look into?

Overcash answered 6/4, 2012 at 19:44 Comment(2)
possible duplicate of Adding unknown (at design time) properties to an ExpandoObjectSchizomycete
Practical use of the above found here: #2974508Reaves
Q
44

ExpandoObject implements IDictionary<string, object>:

((IDictionary<string, object>)obj)[propName] = propValue

I don't know off the top of my head whether you can use the indexer syntax with a dynamic reference (i.e., without the cast), but you can certainly try it and find out.

Qualls answered 6/4, 2012 at 19:45 Comment(5)
you can't index an ExpandoObject as you've done in your first exampleFoggy
Second example is good. First example gives Cannot apply indexing with [] to an expression of type 'System.Dynamic.ExpandoObject'Overcash
@Overcash thanks -- I had forgotten that the indexer is an explicit interface implementation. Answer edited.Qualls
@VBRonPaulFan yes, I had forgotten that the interface implementation is explicit. I've edited the answer.Qualls
man, i am so glad i found this post. i was about to implement some object off of DynamicObject from some other tutorials just to get this ability. life and time saver thanks!! :DGaberdine
D
21

Cast the ExpandoObject to an IDictionary<string,object> to do this:

string propName = "ProductNumber";
dynamic obj = new System.Dynamic.ExpandoObject();
var dict = (IDictionary<string,object>)obj;
dict[propName] = 123;
Doorpost answered 6/4, 2012 at 19:46 Comment(1)
+1 for at least mentioning that ExpandoObject is IDictionary<string,object> underneath. See docsEye

© 2022 - 2024 — McMap. All rights reserved.