dynamic and ExpandoObject

tree_volteretaThe dynamic and ExpandoObject have a relation of love and hate with .NET developers. One side defends strongly typed objects to handle data, so it’s possible to handle a lot of issues at compile time. The other side, are developers used to develop scripts, python, and in other similar languages. They defend the dynamic nature of the current projects, with a lot of Xml, Json and unstructured data, so they prefer to use the more dynamic and functional structures of C#. Both are right! Some like to live strong typed and predictable, others like to live on the edge!

Personally, I am a hybrid developer, I like the strong type of languages, but love python and dynamic freedom, like C# provides. So it’s usual for me to use strongly typed objects on my projects, but every time I have to deal with unstructured data, I use the dynamic word and other constructs like Tuple class.

Because sometimes there are too many DTOs on the project!

ExpandoObject Basic Usage

dynamic myGuessObject = new ExpandoObject();

myGuessObject.Name = "Pepe Ribas";
myGuessObject.Address = new ExpandoObject();
myGuessObject.Address.Line1 = "Horizon Street";
myGuessObject.Address.Number = 23;
myGuessObject.Country = new ExpandoObject();
myGuessObject.Country.Code = "PT";
myGuessObject.Country.Name = "Portugal";

// Basic Stuff
Console.WriteLine($"{myGuessObject.Name}");
Console.WriteLine($"{myGuessObject.Address.Line1}, {myGuessObject.Address.Number}");
Console.WriteLine($"{myGuessObject.Country.Code} - {myGuessObject.Country.Name}");

ExpandoObject with methods

dynamic dynamicCalculator = new ExpandoObject();

dynamicCalculator.Add = new Func((v1, v2) => v1 + v2);
dynamicCalculator.Sub = new Func((v1, v2) => v1 - v2);
dynamicCalculator.Mul = new Func((v1, v2) => v1 * v2);
dynamicCalculator.Div = new Func((v1, v2) => v1 / v2);
dynamicCalculator.Mod = new Func((v1, v2) => v1 % v2);

Console.WriteLine($"7 + 8 = {dynamicCalculator.Add(7,8)}");
Console.WriteLine($"7 - 8 = {dynamicCalculator.Sub(7, 8)}");
Console.WriteLine($"7 * 8 = {dynamicCalculator.Mul(7, 8)}");
Console.WriteLine($"7 / 8 = {dynamicCalculator.Div(7, 8)}");
Console.WriteLine($"7 % 8 = {dynamicCalculator.Mod(7, 8)}");

Reflection on the ExpandoObject

dynamic dynamicReflection = new ExpandoObject();
 
dynamicReflection.Name = "Pepe Ribas";
dynamicReflection.Address = new ExpandoObject();
dynamicReflection.Address.Line1 = "Horizon Street";
dynamicReflection.Address.Number = 23;
dynamicReflection.Country = new ExpandoObject();
dynamicReflection.Country.Code = "PT";
dynamicReflection.Country.Name = "Portugal";
 
var typedDynamic = (IDictionary) dynamicReflection;
Console.WriteLine($"Name = {typedDynamic["Name"]}");
var addressEO = (IDictionary)(IDictionary)dynamicReflection.Address;
Console.WriteLine($"Address Line1 = {addressEO["Line1"]}");

No Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

Bad Behavior has blocked 86 access attempts in the last 7 days.

Hyper Smash