Friday, July 30, 2010
 
   
 
Welcome to my site

First let me say thanks for stopping by my site. My name is David Hanson-Graville and I am a IT consultant working in the UK. Let me make it clear, I am passionate about technology and specifically .net and its various forms. I've programmed in a range of langages, but I can say, I am now at my happiest when coding with c#. I hope my blog is an enjoyable & educational read and please feel free to email me at David.Hanson@OnTheBlog.net if you have any questions. 

C# 4.0 and Dynamic Objects Part 1 Minimize
Location: BlogsOnTheBlog    
Posted by: David Hanson Thu, 13 Nov 2008 00:19:26 GMT

Over the last week I have been watching a number of sessions that were recorded at PDC. One that I particularly enjoyed was Anders Hejlsberg “Future of C#”.

During this talk Anders provides a brief introduction to dynamics support in C#. If you’re not sure what dynamics really are then the best way to describe it is the ability to perform lazy evaluation of an objects data type & members at runtime. To make this clearer we can look at C# as it stands today as a purely static language. If we define a new class within c# 3.5 show below we are generally bound to use only the members that have been defined on the contract.

    public class PlainOldObject

    {
        public string Name { get; set; }
        public int Age { get; set; }

    }

Now when it comes to using the PlainOldObject class we can only do so in a limited way as compilation will fail if we try to access properties that do not exist. Take for example

            PlainOldObject plainOldObject = new PlainOldObject();
            plainOldObject.Name = "Dave Hanson";
            plainOldObject.Age = 30;

            plainOldObject.FavouriteLanguage = "c#";

This fails compilation with an error of “'PlainOldObject' does not contain a definition for 'FavouriteLanguage'”. In order to get this code to compile in our current c# 3.5 code we need to go back to the class and implement a new property called FavouriteLanguage of type string.

Introducing the Dynamic Type

Dynamics support in c# 4.0 solves this issue for us! In C# 4.0 a new static type is being introduced called dynamic. The dynamic type tells the c# compiler to ignore type checking at compile and instead leave the evaluation until runtime. The dynamic type can be applied to any .net type but more importantly it can be applied to external resources such as XML, COM objects and Scripts.

So given we have late binding of members now supported in C# 4.0 with the use of the dynamic type what will our code example from above look like. This is show below.

            dynamic plainOldObject = new PlainOldObject();

            plainOldObject.Name = "Dave Hanson";
            plainOldObject.Age = 30;

            plainOldObject.FavouriteLanguage = "c#";

As you can see the code looks almost identical. Apart from the dynamic keyword nothing else has changed. However, under C# 4.0, when you go to compile you will not be faced with a compilation error as was shown before. At this point we can see that the compiler is no longer checking all the members of the type during compile but we are still faced with the issue that our PlainOldObject does not actually implement the property FavouriteLanguages. In fact, running the code will cause an exception to be throw. 

The next issue we need to solve is how we go about create a dynamic object that can be extended arbitrarily. To do this, we follow the approach most dynamic languages follow. As types have no fixed structure in dynamic languages they must store their data in a generic way, therefore they often implement an internal collection within the type which will store data for each dynamic property is set. Implementing this pattern in C# 4.0 is relatively straight forward.

Introducing DynamicObject

In order for us to create our own dynamic objects Microsoft have provides us with an abstract class called DynamicObject. This abstract class has a number of virtual methods which we can override and that provide interceptors for all method invocations, property getters and setters as well some other useful functions. This is shown below. 

    public abstract class DynamicObject : IDynamicObject
    {
        public virtual object GetMember(GetMemberBinder info);
        public virtual object SetMember(SetMemberBinder info, object value);
        public virtual object DeleteMember(DeleteMemberBinder info);
        public virtual object UnaryOperation(UnaryOperationBinder info);
        public virtual object BinaryOperation(BinaryOperationBinder info, object arg);
        public virtual object Convert(ConvertBinder info);
        public virtual object Invoke(InvokeBinder info, object[] args);
        public virtual object InvokeMember(InvokeMemberBinder info, object[] args);
        public virtual object CreateInstance(CreateInstanceBinder info, object[] args);
        public virtual object GetIndex(GetIndexBinder info, object[] indices);
        public virtual object SetIndex(SetIndexBinder info, object[] indices, object value);
        public virtual object DeleteIndex(DeleteIndexBinder info, object[] indices);
        public MetaObject IDynamicObject.GetMetaObject();
 

    }

So in order to allow our PlainOldObject to support dynamic behaviour we need to inherit the DynamicObject class and then override the GetMember and SetMember methods. In our implementation of these methods we need to ensure that if the SetMember is called we place a value into the internal dictionary of values held within PlainOldObject and if the GetMember is called we need to retrieve the value. Below is an example of this code. 

    public class PlainOldObject : DynamicObject
    {
        private Dictionary<string,object> _members = new Dictionary<string,object>();
 
        public override object GetMember(GetMemberAction member)
        {
            return _members[member.Name];
        }
 
        public override object SetMember(SetMemberAction member, object value)
        {
           _members[member.Name] = value;
        }

    }

And that’s it.... were done. We now have an extensible dynamic object that can be extended without having to implement new properties. 

            dynamic plainOldObject = new PlainOldObject();
            plainOldObject.Name = "Dave Hanson";
            plainOldObject.Age = 30;
            plainOldObject.FavouriteLanguage = "c#";
            plainOldObject.Height = 6.0;
            plainOldObject.Sex = "Male";
            plainOldObject.Foo = "Bar"
 
Permalink |  Trackback

Your name:
Title:
Comment:
Security Code
Enter the code shown above in the box below
Add Comment   Cancel 
Tweets Minimize
Twitter / LordHanson
  1. LordHanson: Flash on iPad....nice. http://www.tipb.com/2010/07/04/frash-android-flash-ported-ipad/

    Published Sun, 04 Jul 2010 22:07:55 +0000 by
  2. LordHanson: Anyone noticed that when typing on your iPhone it sounds like your holding a gieger counter?

    Published Sun, 04 Jul 2010 22:05:28 +0000 by
  3. LordHanson: Missing wacko's music... What's happened to the album he was working on before he died?

    Published Fri, 25 Jun 2010 23:01:45 +0000 by
  4. LordHanson: New version of Connectify cannot recognise my active Internet connection! Had to roll back to previous version! #fail

    Published Fri, 25 Jun 2010 22:54:54 +0000 by
  5. LordHanson: vuvuzela blowing spoils the world cup! Fact!

    Published Mon, 14 Jun 2010 05:08:43 +0000 by
  6. LordHanson: About http://www.theaustralian.com.au/business/news/us-competition-regulators-to-investigate-apple/story-e6frg90x-1225878779986

    Published Mon, 14 Jun 2010 00:04:45 +0000 by
  7. LordHanson: In the camper van and a storm is coming.....How exciting.

    Published Sun, 25 Apr 2010 04:39:48 +0000 by
  8. LordHanson: My vaio p is doing well while travelling. 3g Internet, HD movies, digital tv, photo editing, wifi router for iPods and much more. Love it

    Published Wed, 10 Mar 2010 10:29:19 +0000 by
  9. LordHanson: Ok so I need to stay techie while away from a computer for a year. Anyone got any ideas.

    Published Mon, 22 Feb 2010 12:31:09 +0000 by
  10. LordHanson: Sitting in YHA Glebe Sydney waiting for the movie night to start

    Published Thu, 18 Feb 2010 08:13:10 +0000 by
  11. LordHanson: I finished work today in prep for travelling. I must admit as i left the office i felt a little emotional. Sign of a good job with great ...

    Published Tue, 26 Jan 2010 17:48:49 +0000 by
  12. LordHanson: Lots of sick sounding people creeping onto the trains today. Stay away stay away!

    Published Fri, 22 Jan 2010 08:14:36 +0000 by
  13. LordHanson: LMAO RT @colmbrophy: so have you seen who owns http://wwwbing.com ? it's not microsoft

    Published Tue, 19 Jan 2010 17:35:43 +0000 by
  14. LordHanson: RT @TeemuHyn: RT @eldarmurtazin: Hate Windows Mobile 7. No apps from previous versions of WM working here. Not compatible at all.

    Published Sun, 17 Jan 2010 19:01:29 +0000 by
  15. LordHanson: The girlfriend has gone all science on me.... She has her head in books about quasars!

    Published Sat, 16 Jan 2010 16:38:58 +0000 by
  16. LordHanson: New blog post: Invoking generic methods with Expression.Call http://bit.ly/5g99Ih

    Published Sat, 16 Jan 2010 16:34:00 +0000 by
  17. LordHanson: Found a nice way to invoke generic methods using expression trees and importantly avoiding Type.Getmethods() which you normally have to do!

    Published Fri, 15 Jan 2010 18:55:38 +0000 by
  18. LordHanson: Tried a dummy run of packing my backpack last night. Just managed to get it all in. The sleeping bag takes half the space. Not good.

    Published Fri, 15 Jan 2010 08:28:47 +0000 by
  19. LordHanson: Why do we get headaches for no apparent reason?

    Published Tue, 12 Jan 2010 15:28:29 +0000 by
  20. LordHanson: @swhelband beer time my friend

    Published Sun, 10 Jan 2010 21:49:44 +0000 by
Print  
Archive Minimize
Print  
Contact me Minimize
Print  
Microsoft Certs Minimize







Print  
Silverlight News Minimize
Silverlight - Google News
  1. Top 10 Things I Wish I Knew Before I Started My Silverlight 4 Project - Redmond Developer News

    Published Thu, 29 Jul 2010 23:21:01 GMT+00:00 by
  2. Microsoft's Flash challenger Silverlight hits Symbian - Register

    Published Tue, 06 Jul 2010 18:54:39 GMT+00:00 by
  3. Windows Phone 7 misses big-business support tools - Register

    Published Mon, 26 Jul 2010 20:32:23 GMT+00:00 by
  4. Neustar Reports Q2 Results, Stock Repurchase - TMCnet

    Published Fri, 30 Jul 2010 13:13:57 GMT+00:00 by
  5. Intertainment begins commercial rollout of Ad Taffy - PR Newswire (press release)

    Published Fri, 30 Jul 2010 14:19:22 GMT+00:00 by
  6. Download Microsoft Expression Studio Ultimate 4.0.20525.0 Free Trial / Full ... - Soft Sailor (blog)

    Published Fri, 30 Jul 2010 08:50:54 GMT+00:00 by
  7. Managing change in the application portfolio - Register

    Published Thu, 29 Jul 2010 09:36:57 GMT+00:00 by
  8. Queen Victoria in Liverpool panoramic picture - Liverpool Echo

    Published Mon, 26 Jul 2010 11:56:30 GMT+00:00 by
  9. AEBN's Silverlight Player Gains Traction with Users - AVN News (press release)

    Published Tue, 27 Jul 2010 20:28:37 GMT+00:00 by
  10. Written by David Conrad - iProgrammer

    Published Tue, 27 Jul 2010 12:39:37 GMT+00:00 by
Print