メタプログラミング C#

5,599 views

Published on

Room metro #23 大阪 & Windows Phone Arch特別編 ~めとべやスペシャルサンクスDay~http://metrostyledev.net/index.php/event/20131026/
2014年3月1日(土)

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,599
On SlideShare
0
From Embeds
0
Number of Embeds
2,845
Actions
Shares
0
Downloads
22
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

メタプログラミング C#

  1. 1. • • • •
  2. 2. • http://slidesha.re/1mMiXAz • http://1drv.ms/NbF2fF • http://bit.ly/1hz6jFT 3
  3. 3. • • • http://atnd.org/events/47189
  4. 4. • •
  5. 5. • • • • • • • •
  6. 6. • • • •
  7. 7. • • • •
  8. 8. • • •
  9. 9. • • • • • •
  10. 10. • • • •
  11. 11. // C のマクロ (危険) #define SWAP(x, y, type) { type temporary__; temporary__ = x; x = y; y = temporary__; } int main(void) { int a = 1; int b = 2; SWAP(a, b, int); return 0; } プリコンパイラー int main(void) { int a = 1; int b = 2; { int temporary__; temporary__ = a; a = b; b = temporary__; } return 0; }
  12. 12. int main() template <int N> { struct Factorial int x = Factorial<3>::value; { return 0; enum { value = N * Factorial<N 1>::value }; コンパイラー } struct Factorial0 { enum { value = 1 }; }; struct Factorial1 { enum { value = 1 * Factorial0::value }; }; }; struct Factorial2 { enum { value = 2 * Factorial1::value }; }; template <> struct Factorial<0> { struct Factorial3 { enum { value = 3 * Factorial2::value }; }; int main() { enum { value = 1 }; int x = Factorial3::value; }; return 0; }
  13. 13. • • • • •
  14. 14. • • T4 テキスト テンプレートを使用したデザイン時コー ド生成 - MSDN
  15. 15. • • • ソース コード (C#、VB、JScript) CodeDOM CodeDOMProvider GenerateCodeFromNamespace CompileAssemblyFromDom アセンブリ
  16. 16. • namespace CodeDomHelloWorldDemo { using System; class Program { static void Main() { Console.WriteLine("Hello world!"); Console.ReadKey(); } } }
  17. 17. • • • •
  18. 18. • •
  19. 19. Expression<Func<Employee, bool>> expression = employee => employee.Name.Contains("山"); employee => employee.Name.Con tains("山") employee Parameters employee Object Body employee.Name Expression Name employee.Name.Co ntains("山") Member Contains Method Arguments “山”
  20. 20. • • • •
  21. 21. • • • Assembly FieldInfo Module Type ・Class ・Interface ・Value Type PropertyInfo EventInfo MethodInfo ConstructorInfo ParameterInfo
  22. 22. • static int Add(int x, int y) { return x + y; }
  23. 23. • • 1. 2.
  24. 24. • • ILSpy - SharpDevelop - SourceForge.net
  25. 25. var method = new DynamicMethod(“add”, …); method.DefineParameter(1, ParameterAttributes.In, "x"); method.DefineParameter(2, ParameterAttributes.In, “y"); var generator = method.GetILGenerator(); generator.Emit(opcode: OpCodes.Ldarg_0); generator.Emit(opcode: OpCodes.Ldarg_1); generator.Emit(opcode: OpCodes.Add generator.Emit(opcode: OpCodes.Ret ); ); Func<int, int, int> newDelegate = method.CreateDelegate(…);
  26. 26. • => 1. 2. (x, y) + x y
  27. 27. • Expression の派生クラス一覧 - 継承階層 - Expression クラス - MSDN ライブラリ
  28. 28. var x = Expression.Parameter(type: typeof(int)); var y = Expression.Parameter(type: typeof(int)); var add = Expression.Add var lambda = Expression.Lambda (left: x, right: y); (add, x, y Func<int, int, int> newDelegate = (Func<int, int, int>)lambda.Compile(); );
  29. 29. • 1. 2. 3.
  30. 30. • Microsoft “Roslyn” CTP •
  31. 31. var engine = new ScriptEngine(); var session = engine.CreateSession(); session.ImportNamespace(…); Func<int, int, int> newDelegate = session.Execute ("(Func<int, int, int>)((x, y) => x + y)");
  32. 32. • •
  33. 33. • 1. 2. 3. • 1. 2. 3. 4.
  34. 34.
  35. 35.
  36. 36. • •
  37. 37. • 1. 2.
  38. 38. • 1. 2. 1. 2. 3. 1. 2. 3. 4. 1. 2. 3.
  39. 39.
  40. 40.
  41. 41. • • • • • •
  42. 42. • オブジェクトの文字列変換を静的/動的に行う • オブジェクトの文字列変換のメタプログラミング • オブジェクトの文字列変換のメタプログラミング (Reflection.Emit 編) • オブジェクトの文字列変換のメタプログラミング (式木編) • オブジェクトの文字列変換のメタプログラミング (Roslyn 編) • オブジェクトの文字列変換のメタプログラミング (パフォーマンスのテスト)
  43. 43. • • • •

×