user1176058
user1176058

Reputation: 676

Adding properties to an object dynamically

I was trying to create objects at runtime. We have .net framework provided classes like DynamicObject and ExpandoObject. Is it possible to create a dynamic object like this

dynamic obj = new expandoObject();
obj["propName1"] = "name"; //string type
obj["propName2"] = 24; //int type

I dont know the property names until runtime. Is it possible to do this way?

Upvotes: 0

Views: 105

Answers (1)

Lasse V. Karlsen
Lasse V. Karlsen

Reputation: 391336

Well, two things.

First, yes, you can stuff values into the ExpandoObject object using "property names" contained in strings, because it implements IDictionary<string, object>, so you can do it like this:

void Main()
{
    dynamic obj = new ExpandoObject();
    var dict = (IDictionary<string, object>)obj;
    dict["propName1"] = "test";
    dict["propName2"] = 24;

    Debug.WriteLine("propName1=" + (object)obj.propName1);
    Debug.WriteLine("propName2=" + (object)obj.propName2);
}

Notice how I use the property syntax to retrieve the values there. Unfortunately, dynamic is like a virus and propagates, and Debug.WriteLine is none too happy about dynamic values, so I had to cast to object there.

However, and this is the second thing, if you don't know the property names until runtime, those last two lines there won't appear anywhere in your program. The only way to retrieve the values is again to cast it to a dictionary.

So you're better off just using a dictionary to begin with:

void Main()
{
    var obj = new Dictionary<string, object>();
    obj["propName1"] = "name";
    obj["propName2"] = 24;

    Debug.WriteLine("propName1=" + obj["propName1"]);
    Debug.WriteLine("propName2=" + obj["propName2"]);
}

Upvotes: 4

Related Questions