Dynamisch und Gefährlich?
C# Dynamics in freier Wildbahn

Tim Bourguignon
Mathema Software GmbH

v1.1
Dynamics? Noooooooo....

Herbstcampus 2013 – Dynamisch und Gefährlich?

3
Dynamics? Noooooooo....

Herbstcampus 2013 – Dynamisch und Gefährlich?

4
Dynamics? Noooooooo....

Herbstcampus 2013 – Dynamisch und Gefährlich?

5
Dynamics? Noooooooo....

Herbstcampus 2013 – Dynamisch und Gefährlich?

6
Compiler says *meep*
string lang = "C#";
lang++;
int theAnswer = 42;
theAnswer.ToUpper();

Herbstcampus 2013 – Dynamisch und Gefährlich?

8
Compiler says *meep*
string lang = "C#";
lang++;
int theAnswer = 42;
theAnswer.ToUpper();

Herbstcampus 2013 – Dynamisch und Gefährlich?

9
Dynamics to the rescue
dynamic lang = "C#";
lang++;
dynamic theAnswer = 42;
theAnswer.ToUpper();

Herbstcampus 2013 – Dynamisch und Gefährlich?

10
Dynamics to the rescue
dynamic lang = "C#";
lang++;
dynamic theAnswer = 42;
theAnswer.ToUpper();

Relax Man,
he knows
what he's doing

Herbstcampus 2013 – Dynamisch und Gefährlich?

11
Dynamics to the rescue
dynamic lang = "C#";
lang++;
dynamic theAnswer = 42;
theAnswer.ToUpper();

Relax Man,
he knows
what he's doing

Herbstcampus 2013 – Dynamisch und Gefährlich?

… or not!

12
What about 'object' or reflection?
Calculator calc = new Calculator();
int sum = calc.Add(10, 20);

Herbstcampus 2013 – Dynamisch und Gefährlich?

13
What about 'object' or reflection?
Calculator calc = new Calculator();
int sum = calc.Add(10, 20);
object calc = new Calculator();
int sum = calc.Add(10, 20);

Herbstcampus 2013 – Dynamisch und Gefährlich?

14
What about 'object' or reflection?
Calculator calc = new Calculator();
int sum = calc.Add(10, 20);
object calc = new Calculator();
int sum = calc.Add(10, 20);

Herbstcampus 2013 – Dynamisch und Gefährlich?

15
What about 'object' or reflection?
Calculator calc = new Calculator();
int sum = calc.Add(10, 20);
object calc = new Calculator();
int sum = calc.Add(10, 20);
object reflectionCalc = new Calculator();
Type calcType = reflectionCalc.GetType();
object result = calcType.InvokeMember("Add",
BindingFlags.InvokeMethod, null,
Activator.CreateInstance(calcType),
new object[] { 10, 20 });
int sum2 = Convert.ToInt32(result);
Herbstcampus 2013 – Dynamisch und Gefährlich?

16
What about 'object' or reflection?
Calculator calc = new Calculator();
int sum = calc.Add(10, 20);
object calc = new Calculator();
int sum = calc.Add(10, 20);
object reflectionCalc = new Calculator();
Type calcType = reflectionCalc.GetType();
object result = calcType.InvokeMember("Add",
BindingFlags.InvokeMethod, null,
Activator.CreateInstance(calcType),
new object[] { 10, 20 });
int sum2 = Convert.ToInt32(result);
Herbstcampus 2013 – Dynamisch und Gefährlich?

17
What about 'object' or reflection?
Calculator calc = new Calculator();
int sum = calc.Add(10, 20);
object calc = new Calculator();
int sum = calc.Add(10, 20);
object reflectionCalc = new Calculator();
Type calcType = reflectionCalc.GetType();
object result = calcType.InvokeMember("Add",
BindingFlags.InvokeMethod, null,
Activator.CreateInstance(calcType),
new object[] { 10, 20 });
int sum2 = Convert.ToInt32(result);
Herbstcampus 2013

dynamic calc = new Calculator();
– Dynamisch und Gefährlich?
int sum = calc.Add(10, 20);

18
Duck-Typing

Herbstcampus 2013 – Dynamisch und Gefährlich?

19
Duck-Typing

Herbstcampus 2013 – Dynamisch und Gefährlich?

20
Duck-Typing
• When I see a bird that
walks like a duck
swims like a duck
and quacks like a duck,
I call that bird a duck
James Whitcomb Riley

Herbstcampus 2013 – Dynamisch und Gefährlich?

21
Duck-Typing
• When I see a bird that
walks like a duck
swims like a duck
and quacks like a duck,
I call that bird a duck
James Whitcomb Riley

vs Be
• Look like
• Methods & Attributes vs Class
Herbstcampus 2013 – Dynamisch und Gefährlich?

22
Duck-Typing
• When I see a bird that
walks like a duck
swims like a duck
and quacks like a duck,
I call that bird a duck
James Whitcomb Riley

vs Be
• Look like
• Methods & Attributes vs Class
Herbstcampus 2013 – Dynamisch und Gefährlich?

23
Dynamic languages: IronPython - IronRuby

Herbstcampus 2013 – Dynamisch und Gefährlich?

24
Dynamic languages: IronPython - IronRuby
#Python script.py
def add(a, b):
return a + b

var pythonRuntime = Python.CreateRuntime();
dynamic pythonScript =
pythonRuntime.UseFile("script.py");
var result = pythonScript.add(100, 200)));

Herbstcampus 2013 – Dynamisch und Gefährlich?

25
Base objects & Tools

Herbstcampus 2013 – Dynamisch und Gefährlich?

26
Base objects & Tools

DynamicObject

Herbstcampus 2013 – Dynamisch und Gefährlich?

27
Base objects & Tools

DynamicObject

Herbstcampus 2013 – Dynamisch und Gefährlich?

ExpandoObject

28
Base objects & Tools

DynamicObject

ExpandoObject

ElasticObject

Herbstcampus 2013 – Dynamisch und Gefährlich?

29
Base objects & Tools

DynamicObject

ExpandoObject

ElasticObject

Gemini
Herbstcampus 2013 – Dynamisch und Gefährlich?

30
Frameworks

Herbstcampus 2013 – Dynamisch und Gefährlich?

31
Frameworks

Massive

Herbstcampus 2013 – Dynamisch und Gefährlich?

32
Frameworks

Massive

Nancy
Herbstcampus 2013 – Dynamisch und Gefährlich?

33
Frameworks

Massive

Nancy
Herbstcampus 2013 – Dynamisch und Gefährlich?

Simple.Data
34
System.Dynamic.DynamicObject
• Exposes members at run time instead of at compile time
• Important methods
• TrySetMember
• TryGetMember
• Is called when a member of a dynamic class is requested and no
arguments are specified
• TryInvokeMember
• Is called when a member of a dynamic class is requested with
arguments

• Combining those functions in a smart way is the key
Herbstcampus 2013 – Dynamisch und Gefährlich?

35
System.Dynamic.ExpandoObject
• Represents an object whose members can be dynamically
added and removed at run time
• Demo
•
•
•
•

Simple ExpandoObject
Expando structure vs Xml structure
ExpandoToXml
Linq-to-Object

http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx
Herbstcampus 2013 – Dynamisch und Gefährlich?

36
ElasticObject
• Multi level dynamic object implementation using .NET 4.0
dynamic features, for fluent access of data types like XML
• Demo
• Expando vs Elastic
• Elastic-to-Xml

https://github.com/amazedsaint/ElasticObject
Herbstcampus 2013 – Dynamisch und Gefährlich?

37
Gemini
• „Brings the capabilities of a dynamic type system to C#“
• Demo
•
•
•
•
•

Members on the fly
Methods on the fly
Object graph
Responds to
Introspection

Herbstcampus 2013 – Dynamisch und Gefährlich?

38
NancyFx
• Lightweight WebFramework
• Demo
• Parameters
• Return object

Herbstcampus 2013 – Dynamisch und Gefährlich?

39
Massive
• Wrapper for DB tables that uses dynamics
• Create a class that wraps a table
• Query away
• Demo
• Usage
• Definition of TryGetMember

Herbstcampus 2013 – Dynamisch und Gefährlich?

40
Conclusion
• Objects
• Core Objects: DynamicObject, ExpandoObject
• Variations: ElasticObject, Gemini
• Usages: NancyFx, Massive, Simple.Data

• DTOs
• Architectural Flexibility
• API Design
• Think about using it!

Herbstcampus 2013 – Dynamisch und Gefährlich?

41
Ich freue mich auf Eure Fragen!
tim.bourguignon@mathema.de
about.me/timbourguignon
@timothep

Weitere ähnliche Inhalte

PPTX
Angular JS deep dive
PPTX
Micro ORM vs Entity Framework
PPTX
Nancy & Simple.Data from ProgNet 11
PPTX
Should you react?
PPTX
NuGet Must Haves for LINQ
PDF
Introduction to Simple.Data
PDF
Breeding unicorn developers - Developer's Journey
PDF
Introduction to the Nancy Framework
Angular JS deep dive
Micro ORM vs Entity Framework
Nancy & Simple.Data from ProgNet 11
Should you react?
NuGet Must Haves for LINQ
Introduction to Simple.Data
Breeding unicorn developers - Developer's Journey
Introduction to the Nancy Framework
Anzeige

C# Dynamics in the Wild

  • 1. Dynamisch und Gefährlich? C# Dynamics in freier Wildbahn Tim Bourguignon Mathema Software GmbH v1.1
  • 2. Dynamics? Noooooooo.... Herbstcampus 2013 – Dynamisch und Gefährlich? 3
  • 3. Dynamics? Noooooooo.... Herbstcampus 2013 – Dynamisch und Gefährlich? 4
  • 4. Dynamics? Noooooooo.... Herbstcampus 2013 – Dynamisch und Gefährlich? 5
  • 5. Dynamics? Noooooooo.... Herbstcampus 2013 – Dynamisch und Gefährlich? 6
  • 6. Compiler says *meep* string lang = "C#"; lang++; int theAnswer = 42; theAnswer.ToUpper(); Herbstcampus 2013 – Dynamisch und Gefährlich? 8
  • 7. Compiler says *meep* string lang = "C#"; lang++; int theAnswer = 42; theAnswer.ToUpper(); Herbstcampus 2013 – Dynamisch und Gefährlich? 9
  • 8. Dynamics to the rescue dynamic lang = "C#"; lang++; dynamic theAnswer = 42; theAnswer.ToUpper(); Herbstcampus 2013 – Dynamisch und Gefährlich? 10
  • 9. Dynamics to the rescue dynamic lang = "C#"; lang++; dynamic theAnswer = 42; theAnswer.ToUpper(); Relax Man, he knows what he's doing Herbstcampus 2013 – Dynamisch und Gefährlich? 11
  • 10. Dynamics to the rescue dynamic lang = "C#"; lang++; dynamic theAnswer = 42; theAnswer.ToUpper(); Relax Man, he knows what he's doing Herbstcampus 2013 – Dynamisch und Gefährlich? … or not! 12
  • 11. What about 'object' or reflection? Calculator calc = new Calculator(); int sum = calc.Add(10, 20); Herbstcampus 2013 – Dynamisch und Gefährlich? 13
  • 12. What about 'object' or reflection? Calculator calc = new Calculator(); int sum = calc.Add(10, 20); object calc = new Calculator(); int sum = calc.Add(10, 20); Herbstcampus 2013 – Dynamisch und Gefährlich? 14
  • 13. What about 'object' or reflection? Calculator calc = new Calculator(); int sum = calc.Add(10, 20); object calc = new Calculator(); int sum = calc.Add(10, 20); Herbstcampus 2013 – Dynamisch und Gefährlich? 15
  • 14. What about 'object' or reflection? Calculator calc = new Calculator(); int sum = calc.Add(10, 20); object calc = new Calculator(); int sum = calc.Add(10, 20); object reflectionCalc = new Calculator(); Type calcType = reflectionCalc.GetType(); object result = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, Activator.CreateInstance(calcType), new object[] { 10, 20 }); int sum2 = Convert.ToInt32(result); Herbstcampus 2013 – Dynamisch und Gefährlich? 16
  • 15. What about 'object' or reflection? Calculator calc = new Calculator(); int sum = calc.Add(10, 20); object calc = new Calculator(); int sum = calc.Add(10, 20); object reflectionCalc = new Calculator(); Type calcType = reflectionCalc.GetType(); object result = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, Activator.CreateInstance(calcType), new object[] { 10, 20 }); int sum2 = Convert.ToInt32(result); Herbstcampus 2013 – Dynamisch und Gefährlich? 17
  • 16. What about 'object' or reflection? Calculator calc = new Calculator(); int sum = calc.Add(10, 20); object calc = new Calculator(); int sum = calc.Add(10, 20); object reflectionCalc = new Calculator(); Type calcType = reflectionCalc.GetType(); object result = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, Activator.CreateInstance(calcType), new object[] { 10, 20 }); int sum2 = Convert.ToInt32(result); Herbstcampus 2013 dynamic calc = new Calculator(); – Dynamisch und Gefährlich? int sum = calc.Add(10, 20); 18
  • 17. Duck-Typing Herbstcampus 2013 – Dynamisch und Gefährlich? 19
  • 18. Duck-Typing Herbstcampus 2013 – Dynamisch und Gefährlich? 20
  • 19. Duck-Typing • When I see a bird that walks like a duck swims like a duck and quacks like a duck, I call that bird a duck James Whitcomb Riley Herbstcampus 2013 – Dynamisch und Gefährlich? 21
  • 20. Duck-Typing • When I see a bird that walks like a duck swims like a duck and quacks like a duck, I call that bird a duck James Whitcomb Riley vs Be • Look like • Methods & Attributes vs Class Herbstcampus 2013 – Dynamisch und Gefährlich? 22
  • 21. Duck-Typing • When I see a bird that walks like a duck swims like a duck and quacks like a duck, I call that bird a duck James Whitcomb Riley vs Be • Look like • Methods & Attributes vs Class Herbstcampus 2013 – Dynamisch und Gefährlich? 23
  • 22. Dynamic languages: IronPython - IronRuby Herbstcampus 2013 – Dynamisch und Gefährlich? 24
  • 23. Dynamic languages: IronPython - IronRuby #Python script.py def add(a, b): return a + b var pythonRuntime = Python.CreateRuntime(); dynamic pythonScript = pythonRuntime.UseFile("script.py"); var result = pythonScript.add(100, 200))); Herbstcampus 2013 – Dynamisch und Gefährlich? 25
  • 24. Base objects & Tools Herbstcampus 2013 – Dynamisch und Gefährlich? 26
  • 25. Base objects & Tools DynamicObject Herbstcampus 2013 – Dynamisch und Gefährlich? 27
  • 26. Base objects & Tools DynamicObject Herbstcampus 2013 – Dynamisch und Gefährlich? ExpandoObject 28
  • 27. Base objects & Tools DynamicObject ExpandoObject ElasticObject Herbstcampus 2013 – Dynamisch und Gefährlich? 29
  • 28. Base objects & Tools DynamicObject ExpandoObject ElasticObject Gemini Herbstcampus 2013 – Dynamisch und Gefährlich? 30
  • 29. Frameworks Herbstcampus 2013 – Dynamisch und Gefährlich? 31
  • 30. Frameworks Massive Herbstcampus 2013 – Dynamisch und Gefährlich? 32
  • 31. Frameworks Massive Nancy Herbstcampus 2013 – Dynamisch und Gefährlich? 33
  • 32. Frameworks Massive Nancy Herbstcampus 2013 – Dynamisch und Gefährlich? Simple.Data 34
  • 33. System.Dynamic.DynamicObject • Exposes members at run time instead of at compile time • Important methods • TrySetMember • TryGetMember • Is called when a member of a dynamic class is requested and no arguments are specified • TryInvokeMember • Is called when a member of a dynamic class is requested with arguments • Combining those functions in a smart way is the key Herbstcampus 2013 – Dynamisch und Gefährlich? 35
  • 34. System.Dynamic.ExpandoObject • Represents an object whose members can be dynamically added and removed at run time • Demo • • • • Simple ExpandoObject Expando structure vs Xml structure ExpandoToXml Linq-to-Object http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx Herbstcampus 2013 – Dynamisch und Gefährlich? 36
  • 35. ElasticObject • Multi level dynamic object implementation using .NET 4.0 dynamic features, for fluent access of data types like XML • Demo • Expando vs Elastic • Elastic-to-Xml https://github.com/amazedsaint/ElasticObject Herbstcampus 2013 – Dynamisch und Gefährlich? 37
  • 36. Gemini • „Brings the capabilities of a dynamic type system to C#“ • Demo • • • • • Members on the fly Methods on the fly Object graph Responds to Introspection Herbstcampus 2013 – Dynamisch und Gefährlich? 38
  • 37. NancyFx • Lightweight WebFramework • Demo • Parameters • Return object Herbstcampus 2013 – Dynamisch und Gefährlich? 39
  • 38. Massive • Wrapper for DB tables that uses dynamics • Create a class that wraps a table • Query away • Demo • Usage • Definition of TryGetMember Herbstcampus 2013 – Dynamisch und Gefährlich? 40
  • 39. Conclusion • Objects • Core Objects: DynamicObject, ExpandoObject • Variations: ElasticObject, Gemini • Usages: NancyFx, Massive, Simple.Data • DTOs • Architectural Flexibility • API Design • Think about using it! Herbstcampus 2013 – Dynamisch und Gefährlich? 41
  • 40. Ich freue mich auf Eure Fragen! [email protected] about.me/timbourguignon @timothep