Loop DynamicObject properties

55,776

Solution 1

Did you tried DynamicDictionary.GetDynamicMemberNames() method? - http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.getdynamicmembernames.aspx

Solution 2

I believe you'd be interested in the ExpandoObject class. The DynamicObject class is just a base where you're meant to provide all the logic. It explicitly implements the IDictionary<string, object> interface so you can access it properties or add new ones that way.

// declare the ExpandoObject
dynamic expObj = new ExpandoObject();
expObj.Name = "MyName";
expObj.Number = 1000;

// print the dynamically added properties
foreach (KeyValuePair<string, object> kvp in expObj) // enumerating over it exposes the Properties and Values as a KeyValuePair
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);

// cast to an IDictionary<string, object>
IDictionary<string, object> expDict = expObj;

// add a new property via the dictionary reference
expDict["Foo"] = "Bar";

// verify it's been added on the original dynamic reference
Console.WriteLine(expObj.Foo);

I had just realized that you are implementing the DynamicDictionary class and misunderstood your question. Sorry.

When used with a dynamic reference, you only have access to publicly exposed members. Since only Count is declared public (besides the other DynamicObject members), you'd need to use reflection in order to access the inner dictionary to easily get those values (if you don't intend to make any further changes).

Share:
55,776

Related videos on Youtube

joeriks
Author by

joeriks

Random internet guy. In search for the better language, tools and framework(s). Currently liking : Javascript, Typescript, Umbraco, Ms Asp Net Mvc 3, WebPages (WebMatrix), NancyFx, ServiceStack, Razor, C#. MS and Stack Overflow fanboy.

Updated on July 09, 2022

Comments

  • joeriks
    joeriks almost 2 years

    I'm trying to understand the DynamicObject type. Found this MSDN article to be very consise and clear as how to create and use DynamicObject:

    http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx

    The article contains a simple DynamicDictionary class that inherits from DynamicObject.

    Now I want to iterate over my dynamically created DynamicObject properties:

    dynamic d = new DynamicDictionary();
    d.Name = "Myname";
    d.Number = 1080;
    
    foreach (var prop in d.GetType().GetProperties())
    {
      Console.Write prop.Key;
      Console.Write prop.Value;
    }
    

    Obviously that does not work. I want to learn how to do this without a change in my DynamicDictionary class, since I'm really trying to learn how to use this for all kinds of existing objects that inherits from DynamicObject.

    Is Reflection needed? I must be missing something...

  • joeriks
    joeriks over 13 years
    Ok, thanks, so - for an existing object which inherits DynamicObject and does not expose the dictionary - there's no way for me (other than to use Reflection) to get the members dictionary?
  • joeriks
    joeriks over 13 years
    Looks good - but I dont want to / cannot change my class and "GetDynamicMemberNames() is an optional thing, i.e. a class inheriting from DynamicObject can override it if it wants, but if it doesn't the function in the base class gets called which returns an empty list."
  • Jeff Mercado
    Jeff Mercado over 13 years
    AFAIK yes. You're only able to access public members and the DynamicObject class where member access is resolved through the various methods. Alternatively, you could explicitly implement the IDictionary<string, object> class just like the ExpandoObject to make this process easier.
  • Jeff Mercado
    Jeff Mercado over 13 years
    p.s., Sorry I glossed over your question at first. I didn't notice that you were actually implementing the example code. I was thinking to myself, "There's no DynamicDictionary class..." :)
  • Anuraj
    Anuraj over 13 years
    Hmm I understand. Then I think either you need to go for ExpandoObject or you need it implement it your own.
  • Bovaz
    Bovaz almost 8 years
    The part of the answer that does not answer the question is exactly what I was looking for.