.netc#-4.0anonymous-classdynamicobject

Is there a way to convert a dynamic or anonymous object to a strongly typed, declared object?


If I have a dynamic object, or anonymous object for that matter, whose structure exactly matches that of a strongly typed object, is there a .NET method to build a typed object from the dynamic object?

I know I can use a LINQ dynamicList.Select(dynamic => new Typed { .... } type thing, or I can use Automapper, but I'm wondering if there is not something specially built for this?


Solution

  • You could serialize to an intermediate format, just to deserialize it right thereafter. It's not the most elegant or efficient way, but it might get your job done:

    Suppose this is your class:

    // Typed definition
    class C
    {
        public string A;
        public int B;
    }
    

    And this is your anonymous instance:

    // Untyped instance
    var anonymous = new {
        A = "Some text",
        B = 666
    };
    

    You can serialize the anonymous version to an intermediate format and then deserialize it again to a typed version.

    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    var json = serializer.Serialize(anonymous);
    var c = serializer.Deserialize<C>(json);
    

    Note that this is in theory possible with any serializer/deserializer (XmlSerializer, binary serialization, other json libs), as long as the roundtrip is symmetric.