Simplify Using Anonymous Types

New Version Available: - Check out this post about the AnonymousType class Remixed!.

When you're using ASP.NET MVC you pass information from the Controller to the View. Your information is found in the ViewDataDictionary where you can cast the info back into whatever form it originally was. Additionally, you can even specify a model type for the page so that no casting is required to access your information.

It may be a little inconvenient, but it's not bad. This just means you need to either define the class in advance or limit yourself to simple values.

If you're writing LINQ queries and creating anonymous types then you're in a tougher situation. I've seen people try and come up with solutions for accessing an anonymous type after its been created, but nothing seemed all that intuitive.

In the next version of C# we're going to see the new dynamic declaration which will most likely solve this problem. For now, Reflection is about the only way you solve this issue.

On a recent project I got a little tired of trying to manually do this each time. I ended up writing a wrapper class (included at the end of the post). The example below shows how you can use this class AnonymousType.

//Controller
//==================
this.ViewData["details"] = new {
  name = "Jim",
  age = 30
};


//View
//==================
AnonymousType details = new AnonymousType(this.ViewData["details"]);

//access properties
string name = details.Get<string>("name");
int age = details.Get<int>("age");

//supply a default type in case the property doesn't exist
bool fake = details.Get<bool>("someFakeProperty", false);

//Use the properties by name - maps to the argument name
details.Use((string name, int age) => { 
  Console.WriteLine("{0} is {1} years old", name, age);
});

//An wrong property name (wrong type or incorrect case) will cause an error
details.Use((int NAME) => { /* Error! */ });

It's really just Reflection, but it streamlines using unknown types inside of a View.

Now, if you are thinking "What about methods? or Fields?" then you're like me. Now, if your second thought was "Well wait, if it has methods then it's a defined class, we should just cast it instead.", then you're much smarter than me. Unfortunately, I spent an hour or so writing ComplexAnonymousType that would call methods (even match correct signatures), access fields, the works... then to realize how much of a wasted effort it was.

Anyways, try it out if interested. Let me know what you think!

Reflection is slower than the normal means of accessing properties. While the time spent is negligible in small amounts, if you're going to be using this code below with a lot of items, it may be wiser to define a class instead.

May 13, 2009

Simplify Using Anonymous Types

Post titled "Simplify Using Anonymous Types

Downloads