Buu Nguyen DYNAMIC BINDING IN C#
Buu Nguyen  Vice President of Technology, KMS Technology  Lecturer, RMIT University Vietnam  Microsoft MVP
Agenda  What is dynamic binding  How is it implemented  When do we need it  Restrictions of dynamic binding
What is Dynamic Binding
C# Language Evolution C# 4.0 C# 3.0 Dynamic binding (*) Named arguments LINQ (*) Optional parameters Auto- properties Generic variance C# 2.0 Collection initializer Field-like events Object initializer Robust locking Generics (*) Anonymous types Better COM interop Nullable types Extension methods Anonymous methods Partial methods C# 1.0 Yield return Partial type Lambda expressions Expression trees Static class Namespace alias
Static vs. Dynamic Binding Static Binding Dynamic Biding  Compiler figures out which  All bindings happen during members to call (binding run time process)  Defer subtype polymorphic resolution till run time
Static Binding
Benefits of Static Binding  Type and name errors are detected at compile time, e.g.  Invoke non-existent members  Pass in arguments with wrong type  Perform illegal cast
Dynamic Binding
How Is It Implemented?
Run Time Binding  Instead of attempting binding and generating CIL, the compiler packages the call and sends it to the Dynamic Language Runtime  At run time, the DLR performs binding and execution
Under the Hood becomes
The Dynamic Language Runtime
Process in a nutshell C# Dynamic builds dynamic Objects User-defined or from other languages compiled uses IDynamicMetaObjectProvider Call Sites cached Delegate Expression emits Tree DLR C# Binder builds
Dynamic Type in CIL
When Do We Need It?
Key Scenarios 1. Access a member with only knowledge of its name, arguments, and target object 2. Interop with dynamic languages, e.g. IronRuby, IronPython 3. Have the target object decide how to respond to a call at run time
Key Scenarios 1. Access a member with only knowledge of its name, arguments, and target object 2. Interop with dynamic languages, e.g. IronRuby, IronPython 3. Have the target object decide how to respond to a call at run time
Access Members
Reflection
Dynamic Type
Single vs. Multiple Dispatch Single Dispatch Multiple Dispatch  Method is selected based  Method is selected based on the runtime type of the on both the runtime type target object of the target object and those of the method’s arguments
Dispatch Example
Key Scenarios 1. Access a member with only knowledge of its name, arguments, and target object 2. Interop with dynamic languages, e.g. IronRuby, IronPython 3. Have the target object decide how to respond to a call at run time
Invoke Ruby Code
Work with Ruby Class
Work with method_missing
Key Scenarios 1. Access a member with only knowledge of its name, arguments, and target object 2. Interop with dynamic languages, e.g. IronRuby, IronPython 3. Have the target object decide how to respond to a call at run time
The Magic Interface IDynamicMetaObjectProvider ExpandoObject DynamicObject
ExpandoObject
DynamicObject’s Operations Name Description TryGetMember Member getter, e.g. obj.Name TrySetMember Member setter, e.g. obj.age = 10 TryDeleteMember Member removal (no equivalent in C#) TryInvokeMember Method invocation, e.g. obj.Invoke() TryConvert Casting, e.g. (int)obj TryCreateInstance Object creation (no equivalent in C#) TryInvoke Self invocation, e.g. obj(10) TryBinaryOperation Binary operation, e.g. obj + 10 TryUnaryOperation Unary operation, e.g. !obj TryGetIndex Indexer getter, e.g. obj[“key”] TrySetIndex Indexer setter, e.g. obj[“key”] = value TryDeleteIndex Indexer removal (no equivalent in C#)
Log Setters & Invocations
StaticInvoker
StaticInvoker
Close to the metal
…Close to the metal
…Close to the metal
Restrictions
Restriction #1  Doesn’t work with extension methods
Restriction #2  Can’t resolve static members or constructors on a dynamic type
Restriction #3  Method groups, anonymous methods and lambda expressions to be casted to exact type
Restriction #4
Thank You! buunguyen@kms-technology.com http://vn.linkedin.com/in/buunguyen http://www.twitter.com/buunguyen http://www.facebook.com/buunguyen
References  DLR specs from http://dlr.codeplex.com/documentation  C# in Depth, 2nd, Jon Skeet, Manning, 2010  Pro DLR in .NET 4.0, Chaur Wu, Apress, 2010

Dynamic Binding in C# 4.0