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!
May 13, 2009
Simplify Using Anonymous Types
Post titled "Simplify Using Anonymous Types