ã©ã³ã¿ã€ã ã§ã®ã³ãŒãçæã¯éåžžã«åŒ·åã§ååã«ç ç©¶ãããææ³ã§ãããå€ãã®éçºè
ã¯ãŸã 䜿çšããããšã«æ¶æ¥µçã§ãã éåžžãåŒããªãŒã®ç ç©¶ã¯ãè¿°èªïŒãã£ã«ã¿ãŒïŒãæ°åŒã®äœæãªã©ã®ç°¡åãªäŸããå§ãŸããŸãã ããããExpression Treesã ããçããŠãã.NETéçºè
ã§ã¯ãããŸããã æè¿ã§ã¯ãã³ã³ãã€ã©èªäœã䜿çšããŠã³ãŒããçæããããšãå¯èœã«ãªããŸãã-ããã¯ããšããããè§£æãã¯ããŒã«ãããã³ãœãŒã¹çæãæäŸããRoslyn / CodeAnalisys APIã©ã€ãã©ãªã䜿çšããŠè¡ãããŸãã
ãã®èšäºã¯ãDotNext 2017ã¢ã¹ã¯ã¯äŒè°ã§ã®Raffaele RialdiïŒTwitterïŒ @raffaeler ïŒã®ã¬ããŒãã«åºã¥ããŠããŸãã Raphaelãšäžç·ã«ãã³ãŒãçæã®å®éã®äœ¿ç𿹿³ãåæããŸãã å Žåã«ãã£ãŠã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã倧å¹
ã«æ¹åã§ããããããžã¬ã³ãã«é¥ããŸã-çæãããã³ãŒããéåžžã«æçšã§ãé »ç¹ã«äœ¿çšããå Žåããã®ã³ãŒããã©ã®ããã«ãããã°ã§ããŸããïŒ ããã¯ãå®éã®ãããžã§ã¯ãã§çºçããåºæ¬çãªåé¡ã®1ã€ã§ãã
Rafaelã¯ã2003幎以æ¥ãDeveloper Securityã«ããŽãªã®MVPãæ±ããå®è·µçãªã¢ãŒããã¯ããã³ã³ãµã«ã¿ã³ããã¹ããŒã«ãŒã§ããçŸåšããšã³ã¿ãŒãã©ã€ãºãããžã§ã¯ãããã¯ãšã³ãã«åŸäºããCïŒããã³C ++ã®ã³ãŒãçæãšã¯ãã¹ãã©ãããã©ãŒã éçºã«ç¹åããŠããŸãã
ã³ãŒãçæãšã¯äœã§ããïŒ ããã©ãŒãã³ã¹ãå®èšŒããå¿
èŠããããšããŸãã ãã³ãããŒã¯ã衚瀺ããã ããªããããã¯äžçš®ã®ããªãã¯ãããªãããŒãªããªãã¯ã«ãªããŸãã èšäºãã¬ããŒãã§ã¯ããã³ãããŒã¯ã®è¡šç€ºãé¿ããã¹ãã§ã-äœè
ã«ãšã£ãŠå±éºãªããã§ã¯ãªãããã³ãããŒã¯ã¯1ã€ã®ã·ããªãªã®ã¿ã瀺ããŠããããã¹ãŠã®èªè
ã«ãšã£ãŠæçšã§ã¯ãªãããã§ãã èªè
ã¯ãææ¡ãããæè¡ã詊ããŠãç¹å®ã®ã·ããªãªã«é©ããŠãããã©ããã倿ããå¿
èŠããããŸãã ãããã£ãŠããã³ãããŒã¯ã®äŸ¡å€ãèªåŒµããªãã§ãã ããã ç§èªèº«ã®ããã«ãç§ã¯ããããäœããŸãã圌ãã¯ãŸãšããªçµæã瀺ããŸãã
å®çŸ©äžããªãã¬ã¯ã·ã§ã³ããã°ã©ã ã¯ãã£ããå®è¡ãããããšãç¥ã£ãŠããŸãã 圌女ã¯ECMA-335ã¡ã¿ããŒã¿ãããŠã³ããŒãããŠè§£éããå¿
èŠããããŸãã ãããã¯éåžžã«ã³ã³ãã¯ããªãã€ããªããŒã¿ã®ã»ããã§ãããèªã¿åãã¯éåžžã«è€éã§ãã ã¢ã»ã³ããªåŸã«ã¡ã¢ãªã倧éã«æ¶è²»ããªããããã³ã³ãã¯ãã«ããå¿
èŠããããŸãã ãããã®ã¢ãŒãã£ãã¡ã¯ãããããã€ããããšãéåžžã«äœã¬ãã«ã®APIãæ±ã£ãŠãããããããã©ãŒãã³ã¹ãäžååã«ãªããŸãã ãšããã§ãããããã¹ãŠã®ã¢ãŒãã£ãã¡ã¯ããã¢ã»ã³ããªããçŽæ¥èªã¿èŸŒãããšã§ãåå°ãåé¿ã§ããŸãã 仿¥ã®ã¬ããŒãã§ã¯ããã«ã€ããŠã¯èª¬æããŸããããèå³ãããå Žåã¯ããã®ã¡ãœããã䜿çšããŠãã¡ã¢ãªå
ã§ã®äžå®ã®ããŒããšã¢ã»ã³ããªãåé¿ããŠããŸãã åæ
å ±ãé€ããã¹ãŠã®ãã®ããã¡ã¢ãªãè§£æŸã§ããŸãã
ã³ãŒããæ£ç¢ºã«çæããå¿
èŠãããã®ã¯ãã€ã§ããïŒ ã¢ã«ãŽãªãºã ãç°¡çŽ åããã®ã«ååãªæ
å ±ãããå Žåã®ã¢ããªã±ãŒã·ã§ã³ã©ã€ããµã€ã¯ã«ã®ãã®éšåã ããã¯ãããšãã°ãããŒã¿ããŒã¹ããååŸããã¬ã³ãŒãã®æ°ãæžãããã£ã«ã¿ãŒã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããååŸã§ããæ
å ±ã§ãã ãŸãã¯ããã©ã°ã€ã³ã«ããŒããããã¿ã€ãã«é¢ããæ
å ±ã ãã¹ãŠã®å¯èœãªãªãã·ã§ã³ãèæ
®ããäžè¬çãªã¢ã«ãŽãªãºã ããªãã¬ã¯ã·ã§ã³ã®å©ããåããŠäœæããã®ã«æéãè²»ããããšã¯éåžžã«æãŸãããããŸããã éçºè
ã¯ãæ®å¿µãªãããéçºãããœãªã¥ãŒã·ã§ã³ãå¯èœãªéãäžè¬çã«ããããšããåŸåãããããã¹ãŠã®å¯èœãªå Žåãšäžå¯èœãªå Žåã«åãçµãã§ããŸãã ç§ãã¡ã®ããã°ã©ãã³ã°ãã€ã³ãã«ãšã£ãŠãããã¯èªç¶ãªæèã®æµãã§ãã ãŸã£ããéã®ã¢ãããŒãããå§ãããŸããæãç°¡æœãªã³ãŒããçæããã®ã«ååãªæ
å ±ãåŸããããŸã§ãèŸæ±åŒ·ãåŸ
ã¡ãŸãã
ã©ã®å Žåã«ã³ãŒãçæãå¿
èŠã§ããïŒ ããšãã°ãLINQè¿°èªã䜿çšããå Žåã è¿°èªãã«ããŒã¯é·ãéå©çšå¯èœã§ãã ãŸãã¯ãããšãã°Excelã®æ°åŒã䜿çšããå Žåã ãã©ã°ã€ã³ããã¿ã€ããããŒããããšãããŸãã¯Reactive Extensionsã䜿çšãããšãã Reactive Extensionsã«æ
£ããŠãã人ã¯ã©ããããããŸããïŒ ããã¯ãããŒã¿ã¹ããªãŒã ãäœæããã°ã«ãŒãããã£ã«ã¿ãªã³ã°ããŠãã®ããŒã¿ã倿Žã§ããåŒãé©çšã§ããåªããã©ã€ãã©ãªã§ãã åå°ã®åã瀺ãããã«ããããã®äŸã®å€ãã瀺ããŸãã

CïŒã®åŒããå§ããŸãããã ãã®ç»é¢ã¯ã Console.WriteLine
åŒã³åºãConsole.WriteLine
çæãããç°¡åãªã³ãŒãäŸã瀺ããŠããŸãã ãããã誰ããå°ããã§ããã-åå°ã䜿çšããããšã®æ¬ ç¹ãææããã ãã§ããªãåå°ã䜿çšããã®ã§ããããïŒ çãã¯ãäžè¬ã«ãªãã¬ã¯ã·ã§ã³ãæŸæ£ããã®ã§ã¯ãªããã³ãŒãã®æã䜿çšãããŠããã»ã¯ã·ã§ã³ãããªãã¬ã¯ã·ã§ã³ãåé€ããããšã§ãã ãªãã¬ã¯ã·ã§ã³ã䜿çšããŠãå¿
èŠãªéã®ããŒã¿ãæœåºããã³ãŒããçæããããšãã°ãã³ãŒããå®è¡ããããŸã§åŸ
æ©ããªãããã«ã«ãŒãå
ã§å§ä»»ã䜿çšã§ããæç¹ãèŠã€ããå¿
èŠããããŸãã
ã³ãŒãã§ã¯ãæ£ç¢ºãªWriteLine
ãªãŒããŒããŒããååŸããããšããå§ãããã®åŸãå
¥åã¡ãã»ãŒãžã«ãªããã©ã¡ãŒã¿ãŒãäœæããŸãã ãã®åŸã Call
ã¡ãœããã«çžåœãããã®ãäœæããŸãã Expression.Call(null, methodInfo, message)
åŒã³åºãExpression.Call(null, methodInfo, message)
ã§ã¯ã null
ã¯éçã¡ãœããã瀺ããŸãïŒ WriteLine
ã¯éçã¡ãœããã§ãïŒã ããã«ããã®åŒã³åºãã«ã¯ãã¡ãœããã«é¢ããæ
å ±ãšã¡ãã»ãŒãžãå«ãåŒæ°ãå¿
èŠã§ãã
ãã®åŸãã©ã ããäœæãããŸãã ããã¯éåžžã«ç°¡åã§ããã©ã¡ãŒã¿ãŒãšã©ã ãã®æ¬äœãæå®ããå¿
èŠããããŸãã ãã§ã«äœæãããã©ã ãã¯ãéåžžã«äŸ¿å©ãª.Compile()
ã¡ãœãããåŒã³åºããŸãã ã¡ã¢ãªå
ã«çŽæ¥ãéåžžã«ç°¡åãªæ¹æ³ã§åœä»€ãäœæãããããåªããŠããŸãã ãœãŒã¹ã³ãŒãã¯ãããŸããããã©ãŽã³ããã¯ã§èª¬æãããŠããæ¹æ³ã§åŠçããå¿
èŠããããã®ã¯äœããããŸããã ã³ã³ãã€ã«ã®æåã®æ®µéãã€ãŸããé·ããŠè€éãªããã¹ãåæã¯ãããŸããã Expressionã®å Žåãæ§æçã«æ£ããããšããã§ã«ããã£ãŠãããããããã¯å¿
èŠãããŸããã ããã¯éåžžã«éèŠã§ãã ããããåŒããªãŒãéåžžã«ããã°ããéåžžã«äžå¿«ãªå³å¯ãªåä»ããè¡ãçç±ã§ãã ãã§ã«ããã€ãã®åŒãäœæããããšããŠããå Žåããããé¢åãªããšãç¥ã£ãŠããŸãã ãããã圢æãããåŒãããã®ã§ãå®éã«ã³ã³ãã€ã«ã§ããŸãã ã³ã³ãã€ã©ã¯ãåçŽã«ããªãŒã®ããŒãïŒã€ãŸããç¹å®ã®åŒïŒãååŸããåŒã³åºãããã³ãŒãã«å¯Ÿå¿ããããŒããäœæããŸãã æåŸã«ãããªã²ãŒããã€ãŸããã³ãŒããå®è¡ããããã®æéã®ææ®µã圢æããŸãã

è¿°èªãäœæãããäŸã瀺ããŸãã å
¥åãšããŠæŽæ°ãåããããŒã«å€ãè¿ãéåžžã«åçŽãªé¢æ°ã 圌女ã®ã³ãŒããèŠãŠã¿ãŸãããã æåã®å
¥åå€ã«å¯ŸããŠã Expression.Parameter(typeof(int), "x")
ãšãããã©ã¡ãŒã¿ãŒãããã«äœæãããŸãã ãã®ã¡ãœããã®å
¥ååŒæ°ã®1ã€ã¯"x"
ã§ããæ³šæããªãã§ãã ããããããã°ã«ã®ã¿å¿
èŠã§ãã 倿°left
ã¯ãåŒx > -10
ã®å·ŠåŽã right
-å³åŽã瀺ããŸãã ãããã®2ã€ã®å€æ°ãããã€ããªæ¯èŒåŒãäœæãããŸãã æåŸã«ã Lambda
åŒãè¿ãããŸãã ãã®å Žåãå¿
èŠã«å¿ããŠããªã²ãŒãã倿Žã§ãããããããªã²ãŒããè¿ããããæãŸããæ¹æ³ã§ãã ãããè¡ãã«ã¯ãVisitorãã¿ãŒã³ã䜿çšã§ããŸããããã¯ãåŒå
ã®ãã¹ãŠã®ããŒããåæããéåžžã«æ£ç¢ºãªæ¹æ³ã§å€æŽããŸãã ããã¹ããæäœããå¿
èŠã¯ãããŸãããããã«ç®çã®ããŒãã«ç§»è¡ããŸãã

ããã€ãã®èª²é¡ã蚪åããå¿
èŠãããäŸãæããŸãã ã³ãŒãã¯LINQã§èšè¿°ãããŠããããã where
ããŒãããè¿°èªãæœåºãããšããŸãã ç®çã®åŒãååŸããããããã«ããžã¿ãŒãæžãããšãã§ããŸãã where
ã«æ¡åŒµã¡ãœããã®åŒã³åºããããã®ã§where
ãã®åŒãèŠã€ããããšãã§ããŸãã æåã®where
ãã©ã¡ãŒã¿ãŒã¯IQueryable<T>
ã§ãããããŒã«å€ãè¿ããŸãã ãããã£ãŠãã©ã®ãã©ãŒã ãå¿
èŠããããããŸãã ãã®åŒã«äœãã远å ããå¿
èŠãããå Žåã¯ãç»é¢äžã®çç¥èšå·ãæžãããŠããå Žæã§ãããè¡ãããšãã§ããŸãã

éå±ããªãããã«ããã¢ã«ç§»ããŸãããã åœåãç§ã¯æ§æè§£æçšã®ããŒã«ãäœæããããããŸããã§ãããéå±ã§ããã®ãããªããã°ã©ã ã¯éåžžé
ãããšãããããæžãããã³ãŒãããããã®ã¿ã¹ã¯ãå®è¡ããã©ã€ãã©ãªããããŸãã å°ãããŠç°¡åã«å€æŽã§ãããã®ãå¿
èŠã§ããã ãŸããè§£æããŒã«ãäœæããå Žåãææ³ãäœæããå¿
èŠããããšããäºå®ã«æ°ä»ããå€ãã®ã©ã€ãã©ãªã䜿çšããå¿
èŠããããŸãã ããã«ãåæåŸã«äœæãããããŒãããšã¯ã¹ãã¬ãã·ã§ã³ãå®éã«è¡šçŸãããã®ã«é¡äŒŒãããããªæ¹æ³ã§ããŒã«ãäœæããããšèããŸããã ãã®çµæãããšãã°ãããã¹ãã®åœ¢ã®åŒx + y
ïŒã³ãŒãã«è¡šç€ºïŒãæ³åãããããèªèããŸããã

ã€ãŸãããã©ã¡ãŒã¿ãæåã§è¡šçŸããããšããŸããã åçŽåã®ããã«ãããè¡ããŸãããããããããããé¿ããããšãã§ããŸãã Expressionã¯ã³ã³ãã€ã«ã®æåã®æ®µéã䜿çšã§ããªããããå°ãªããšãåãæå®ããããšãéèŠã§ãã ããšãã°ãèªåå倿ãŸãã¯æé»çãªå倿ã¯äœ¿çšã§ããŸããã integer
ããdouble
ãžã®å€æã¯äœ¿çšã§ããŸããã ããã¯ãã¹ãŠæåã§è¡ãå¿
èŠããããŸãã
ãããã¬ãŒã®ç»é¢ã«è¡šç€ºãããã³ãŒããå®è¡ãããšãExpressionãè¿ãããŸãã ã©ã ãã¯ããªãå¥åŠãªæ¹æ³ã§Visual Studioãããã¬ãŒã«è¡šç€ºãããŸãããããã«ã¯äœã®åé¡ããããŸããã è€éã«èŠããŸãããæçµçã«ã¯x + y
ã«ãªããŸãã

ç§ãããã¹ãã§æžããSUM()
颿°ãã©ã®ããã«ç¿»èš³ã§ãããèŠãŠã¿ãŸãããã ããã¹ãããžã¥ã¢ã©ã€ã¶ãŒã¯ãç¿»èš³çµæãçŸåšé
眮ãããŠãã倿°e
ããŸãã Excelãšåãããã«ãå®çŸ©æžã¿ã®é¢æ°ã§FunctionsHelper
ãå®çŸ©ããããšãããããŸãã ãããã®çš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ã颿°ã®äžçš®ã®èªåœãäºåã«æ±ºå®ããå¿
èŠããããŸãã ããã¯ãã¹ãŠéåžžã«ç°¡åã§ãã

ã³ãŒããããå°ã詳ããèŠãŠã¿ãŸãããã GetFilter()
颿°ããããŸãã

ã芧ã®ãšãããããã¯ã©ã ãã§ãã éåžžããã®ãããªå Žåã Func<int, bool>
è¿ããããã以å€Func<int, bool>
äœãè¿ãããŸããã ãã ããã³ã³ãã€ã©ã«ã¯ã颿°ã«è§ãã£ãããªãå Žåã«Expression<Func<int, bool>>
è¿ãããšãã§ããç¹å¥ãªæ©èœããããŸãã ã€ãŸãããã®ãã¥ãŒã«å¯ŸããŠåŒãèªåçã«äœæãããŸãã ããã¯ãŸã 倿Žã§ãããããéåžžã«äŸ¿å©ã§ãã çªå·ãåé€ããŠå¥ã®çªå·ã«çœ®ãæããå Žåã¯ãåŒã«Visitorãèšè¿°ããå¿
èŠãªå€æŽãå ããã ãã§ãã

2çªç®ã®ãã¢ãèŠãŠã¿ãŸãããã ãã®äžã«ã¯ãæåããè¿°èªExpression<Func<int, bool>> predicate
ãŸãã
ã³ãã³ãã©ã€ã³ã«åºåãäžããããã«ãããã«ã€ã³ãžã§ã¯ã·ã§ã³ãè¡ãããã§ãã è¿°èªãš2ã€ã®ã©ã ããã€ã³ãžã§ã¯ã¿ãŒã«æž¡ãã x
ã®å€ãåãåããšãæ¯å{x} => YES
ãŸãã¯{x} => NO
ãåºåããããx
æå®ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®èµ·ååŸã injected
倿°ãã©ã®ããã«èŠããããèŠããšã If
ã¹ããŒãã¡ã³ããå«ã颿°ã衚瀺ãããŸããå
ã®å€ãšæ¯ã¹ãŠå€§å¹
ã«å€æŽãããŠããŸãã

ãã®ãããããã§ã¯æŽæ°ãå
¥åããã If
ã€ã³ãžã§ã¯ã·ã§ã³ãè¡ããããšãå€ã«å¿ããŠYES
ãŸãã¯NO
ãã³ã³ãœãŒã«ã«åºåãããæåŸã«åŒã§åŠçãããå€ãè¿ãããŸãã ãããã®çš®é¡ã®ã³ãŒã倿Žã¯ãã§ã«å®è·µãããŠãããéåžžã«åŒ·åã§ãã
ããããæ¢ã«æ°ä»ããŠããåé¡ããããŸã-çæãããã³ãŒãããŸã 瀺ããããžã¥ã¢ã©ã€ã¶ãŒã¯ãããªãå¥åŠãªåœ¢ã§æ
å ±ãæç€ºããŸãã åŒã䜿çšããããã°ã©ãã³ã°ã«ã¯ç¹å®ã®å©ç¹ããããŸãããéçºè
ã®èгç¹ããèŠããšãã³ãŒãã¯ãæ±ããã§ãã
ãã¢ã«æ»ããŸãã é
å»¶å®è¡ã«ã€ããŠã¯æ¢ã«èª¬æããŸãããæ°å€ã®åæãå®äºãããŸã§ã次ã®ã³ãŒãã¯å®è¡ãããŸããã ä»ããtoList
ãååŸãããšããããã®ãªã¹ããšConsole.WriteLine
äž¡æ¹ãååŸãããŸãããã®å Žåããããã¯èªåçã«å®è¡ãããŸãã


ããã¯ãã¹ãŠè¯ãããã§ããããã£ãšè€éãªããšã詊ããŠã¿ãããšæããŸãã æ¬¡ã®äŸã¯å€¢ã®äžã§ç§ã«æ¥ãŸããã ã³ã³ãã€ã«æã«ãèŸæžïŒããããJSONïŒã®ããŒã¿ãç¹å®ã®é åºã§å€æããã©ã ããäœæããŸãã ã¿ã¹ã¯ã¯éåžžã«æ®éã§ãã

ãªãã¬ã¯ã·ã§ã³ã䜿çšããŠãã®ã³ãŒããå®è¡ãããšãçµæã¯ç»é¢ã«è¡šç€ºãããããã«ãªããŸãã

衚瀺ããããã£ãå埩åŠçããåããããã£ã®èŸæžãç
§åããã³ããŒããŸãã æããã«ãã®ã³ãŒãã¯é
ãã§ãããã 1åããå®è¡ãããªãå Žåãããã¯åé¡ã§ã¯ãããŸãããã100äžåå®è¡ããå¿
èŠãããå Žåã¯çè§£ã§ããŸãã ãµãŒããŒãªãœãŒã¹ãæ¶è²»ãããµãŒããŒã¢ããªã±ãŒã·ã§ã³ã§ãããçºçããå Žåãããã奜ãŸãªã人ãããŸãã
å¥ã®æ¹æ³ã§ãã®åé¡ã解決ããŠã¿ãŸãããã ããã§ã¯ã `Orderãªããžã§ã¯ããã³ãŒãå
ã«äœæããããã®èŠçŽ ã¯ã¯ã©ã¹ã«å
¥ãèŸæžã«åŸã£ãŠèšå®ãããŸãã

å€ã¯èŸæžããæœåºãããå¿
èŠãªã¿ã€ãã«å€æãããŠã³ããŒãããŸãããããã¯ãã¹ãŠå®å
šã«äžæ°å³ã§éå±ã§ãã
ãããããã§ã«Order
ãªããžã§ã¯ããç¥ã£ãŠããã©ã ããäœæãããã©ããªããŸããïŒ

ãã®ãªããžã§ã¯ãã®ã¿ã€ãã瀺ãããšãéèŠã§ãã <Order>
䜿çšããªãããšã«æ³šæããŠãã ããã ããã¯çŽ æŽãããããšã§ããããã®ã¿ã€ããããããªãå Žåã¯ã©ãã§ããããïŒ é
å»¶ãã©ã°ã€ã³ã§Order
ãå®çŸ©ãããŠããå Žåã¯ã©ããªããŸããïŒ ãžã§ããªãã¯ã圹ç«ã€å ŽåããããŸããããã®å Žåããã®æ
å ±ãç¡èŠããå¿
èŠãããããããããã®äœ¿çšã¯æãŸãããããŸããã
ãããã£ãŠãã³ã³ãã€ã«åŸã«ã©ã ããèŠãŠãã ããã

æ¬åœã«ã圌女ã¯ããã§ããïŒ ã³ãŒãã¯èªã¿ãããã§ãã åŒã䜿çšããŠçæãããŸããã ExpressionGeneration
ã¯ã©ã¹ã§ã©ã®ããã«èšè¿°ãããŠããããèŠãŠã¿ãŸãããã

ã³ãŒãã¯ããªãã¬ã¯ã·ã§ã³ã䜿çšããŠæžãããã®ã«äŒŒãŠããããšãããããŸãã Expression.Parameter()
ãå®çŸ©ããã result
倿°ãå®çŸ©ããã Activator.CreateInstance
ã䜿çšããŠæ°ããnewEntityType
ãäœæãããæ°ããã€ã³ã¹ã¿ã³ã¹ãassign倿°ã«å²ãåœãŠãããŸãã ãã¹ãŠãéåžžã«éå±ã§ãã æ¬¡ã«ã type.getMethod()
ãtype.getMethod()
ãŠã¡ãœãããååŸãããã®åŸentityProps
ããããã£ãentityProps
ãŸãã

ãã®å Žåãããããã£ãããã€äœæããããããã£ãŠããããããã®å Žåã¯ã«ãŒããäœæããå¿
èŠã¯ãããŸããã ãããã£ãŠã callTryGetValue
å¿
èŠãªå€ãçæããããã«å¿
èŠãªåŒã³åºãã¯ãããã§çæãããŸãã

次ã®è¡ã¯Expression.Convert()
ã¡ãœãããåŒã³åºããŸããåã¯ç°ãªãå¯èœæ§ããããããããã«ãã£ã¹ãããå¿
èŠããããŸãã æ¬¡ã«ãããããã£ã«ã¢ã¯ã»ã¹ããã«ã¯ã Expression.MakeMemberAccess()
åŒã³åºããŸãã ãã®åŸãtry-catchã³ã³ã¹ãã©ã¯ãã«å¯ŸããŠExpression.IfThen()
ãåŒã³åºãããŸãã æåŸã«ããããã¯ãã€ãŸãééãã©ã±ãããäœæãããŸãã ãã®çµæãã©ã ããååŸãããŸãã

ExpressionsSorcererããŒã«ãäœæããŸããã ã³ãŒããååŸããŠã %USERPROFILE%/Visual Studio 2017/Visualizers
ãã£ã¬ã¯ããªã«é
眮ããã¬ãã¥ãŒããã°ããã®ã³ãŒãã®ãããã°ãå®è¡ã§ããŸãã ä»åã¯ãããžã¥ã¢ã©ã€ã¶ãŒã§ã©ã ããèŠãããšãã§ããããªãŒã®åœ¢ã§è¡šç€ºãããŸãã

ãã®çš®ã®æäœã¯éåžžã«äŸ¿å©ã§ãèããã®ã«åœ¹ç«ã¡ãŸãããããã§äœãæžããŠããã®ã§ããããïŒ å¥ã®ããªãŒããŒããéžæãããšãããããã£ãšãã®å€ãå³åŽã®ãŠã£ã³ããŠã«è¡šç€ºãããŸããããã¯éåžžã«äŸ¿å©ã§ãã ãéã³ã³ãã€ã«ããããœãŒã¹ã衚瀺ãã¿ããéããŸãã ç§ãã¡ã®åã«ã¯ãã³ãŒããžã§ãã¬ãŒã¿ãŒã«æž¡ãããæ
å ±ãããã°æžãã³ãŒãããããŸãã

ããããç§ã¯æã§ãã®ã³ãŒãã«è§ŠããŸããã§ããã CïŒã³ãŒããçæããŸããã§ããã ExpressionsãäœæããŸãããã€ãŸããæ§æããŒãã®ã¿ãèšæ¶ã«ãããéã³ã³ãã€ã«ããå¿
èŠããããŸããã Roslynã®ãããã§ãããã«ãè²ã®ããŒãã³ã°ããããå¿
èŠã«å¿ããŠå€æŽã§ããŸãã ããã«ãã³ã³ãã€ã«äžã«çºçããå¯èœæ§ã®ããæé©åãå¿
èŠãªãããã DebuggableAttribute
屿§ã远å ããŸããã ããªãã¯ãªãç§ãããããå¿
èŠãšããªãã®ãå°ãããããããŸãã ãããŠèŠè¿ãã«ãç§ã¯ããªãã®ããã«å¥ã®é©ãããããŸãã
ïŒ "F11"ãæŒããŠïŒãããã°ã䜿çšããŠã³ã³ãã€ã«ããå Žåãèªåçæãããã¡ãœããã«å
¥ããŸããããã®ã¡ãœããã¯èªåã®æã§ã¯æžããŸããã§ããã å°è±¡çã§ããã ããã§ã倿°ã®çŸåšã®å€ã確èªã§ããŸããåŒã®ãšã©ãŒã確èªã§ããŸãã ã芧ã®ãšãããå
¥ååŒæ°ã«Description
å€ããªãã£ãããã TryGetValue
ã¡ãœããã䜿çšãããŸããã

åé¡ã®é¢æ°ã®æåŸã«ãæ£ããæ°ã®å€ãæã€order
倿°ãååŸããŸãã
äžéçµæãèŠçŽããŸãã åŒã¯èšèªã®ã»ãŒå
šäœãã«ããŒãããããã䜿çšããŠif
ã throw
ã catch
çæã§ããè€éãªæ§é ãäœæã§ããŸãã ãããããã®ããã«ã¯ããããããç¹å¥ãªããŒã«ãå¿
èŠã§ãã ç§ã®ããŒã«ã§ã¯ãæžãã®ãæãé£ããéšåã¯æé»çãªå倿ã§ããã double x
倿°ãäœæãã integer
倿°ã«å€ãå²ãåœãŠãããšãããšã InvalidCastException
ãŸãã ãã®çç±ã¯ãæé»ã®å€æã¯ã³ã³ãã€ã©ãŒã«ãã£ãŠè¡ãããŸãããããããªãã£ãããã§ãã ãããã£ãŠãã³ã³ãã€ã©ãéåžžè¡ãããšã®ããã€ããåŠçããå¿
èŠããããŸããã
ããè€éãªåŒãããã€ã玹ä»ããŸãã ç»é¢ã§ã¯ãéåžžã«åçŽãªãªããžã§ã¯ããäœæãããã³ãŒãã¯var newObject = ExpressionInterop.BuildNewObject(ctor)
ã§ãã

ããžã¥ã¢ã©ã€ã¶ãŒã§ãããèŠããšãæ°ãããªããžã§ã¯ãnew Order()
ã©ã®ããã«new Order()
ããããããŸãã

æ¢ã«è¿°ã¹ãçç±ã«ããã typeof()
ã¡ãœããã䜿çšããããšãåžžã«ãå§ãããŸãã æ¬¡ã«ã GetConstructor
ã¡ãœããã䜿çšããŠGetConstructor
å¿
èŠãªã³ã³ã¹ãã©ã¯ã¿ãŒãååŸããæ¬¡ã«GetMethod
ã¡ãœãããä»ããŠå¿
èŠãªã¡ãœãããååŸããŸãã ãã®åŸãã³ã³ã¹ãã©ã¯ã¿ãŒã«é¢ããæ
å ±ãéä¿¡ãããæ°ãããªããžã§ã¯ãExpressionInterop.BuildNewObject(ctor)
ãäœæãããŸãã ãªã©ãªã©ã
ããã«ã€ããŠã¯ãã以äžè©³ãã説æããŸããã ããããããããã£ã«å€ãå²ãåœãŠããšåŒãã©ã®ããã«èŠãããã瀺ããããšæããŸã...
ã³ã³ãã€ã«ã¢ãŒãã£ãã¡ã¯ãã¯æ¬¡ã®ãšããã§ãã


ããããæ¬åœã®è¡šçŸã«æ»ããšãããªãæ··ä¹±ããŠããããã«èŠããŸãã ç§ãäœæããæãè€éãªåŒã®1ã€ã¯ãããŒã·ã£ãªã³ã°ã«äœ¿çšãããŸãã AddAsync
éåæã³ãŒããå®è¡ã§ããã³ãŒããçæãAddAsync
...

...åŒã«Task<T>
衚ãã³ãŒããååšããªãå Žåã§ãã

ã³ã³ãã€ã©ãŒMono.Cecilã¯å®å
šãªéã³ã³ãã€ã«ãäœæã§ããªããããã³ãŒãã¯éåžžã«æ··ä¹±ããåã³ã³ãã€ã«ã§ããŸããã ãããã圌ã¯å°æ¥ãããè¡ãããšãã§ããã§ãããã ããã«ãããã§ã®åé¡ã¯ã Task<int>
å€éšé¢æ°ãæ¿å
¥ããå¿
èŠãããããšã§ãã ããã¯ãéåæã©ã€ãã©ãªã®åãšãéåæ/åŸ
æ©ããµããŒãããããã®ã³ã³ãã€ã©ã®å€æŽåã«åŒãäœæãããããã§ãã ãããã£ãŠãã³ã³ãã€ã©ã§çæããŠawaitã䜿çšããããšã¯ã§ããŸããã ã³ã³ãã€ã©ãŒã¯ãã¹ãŠã®éæ³ãè¡ãã®ã§ãILSpyã䜿çšããŠawaitã§äœæãããã¢ãŒãã£ãã¡ã¯ããèŠããšãããã«ç¶ç¶ããã³ãŒã«ããã¯ã衚瀺ãããŸãã ã³ãŒãã¯éåžžã«è€éã§ãã
ããã§ãã©ãã§æ¢ããŸãããïŒ åŒãäœæããŠãç¹å®ã®è¿°èªã颿°ãif-then-elseãthrow-catchãªã©ãå«ãããªãè€éãªã³ãŒããçæããŸããã ããºãªã³ã«ã€ããŠè©±ããŸãããã

Roslynã¯ãæ°å¹ŽåããCïŒã®ã¡ã€ã³ã³ã³ãã€ã©ãšããŠåäœããŠãã.NETã³ã³ãã€ã©ãã©ãããã©ãŒã ã§ãã ã€ãŸãã圌ã¯ç§ãã¡ã®äžçãæ¯é
ããŠããŸãã ãã€ãŠç§ãã¡ã«ã§ããããšã¯ã»ãšãã©ãããŸããã§ããããRoslynãAPIããªãŒãã³ããŠãããŸããã ããã§ããã®ã³ã³ãã€ã©ã®APIã䜿çšããŠããã¹ãŠãçŽæ¥è¡ãããšãã§ããŸãã æžåŒèšå®ãã·ã³ãã«ã«é¢ããæ
å ±ãããŸããŸãªãã®ã®ã³ã³ãã€ã«ãã·ã³ãã«ã®è§£éãã¢ã»ã³ãã©ã®èåŸã®ã¡ã¿ããŒã¿ãžã®é©åãªã©ãè¡ãããšãã§ããŸãã ã«ã©ãŒããŒãã³ã°ã«é¢ããŠã¯ãRoslynã¯çŽæ¥å¶åŸ¡ããŸããã 圌ã¯ãããã¯ç·ã§ãªããã°ãªãããããã§ãªããã°éã§ãªããã°ãªããªãããšã¯ç€ºããŠããªãã åæãããããŒã¯ã³ã®åé¡ããããããŸããŸãªæ¹æ³ã§è¡šç€ºã§ããŸãã
ãããã£ãŠãå€ãã®ããŒã«ãå©çšã§ããŸãããåé¡ããããŸãã ããºãªã³ã«ã¯åŒ·ãåä»ãã¯ãããŸããã æ§æããŒãããããèŠçŽ ã¯æ§æããŒãã§ãããããéåžžã«äœ¿ããããã§ãã ããŒããçžäºã«æ¥ç¶ããããšã«æ³šæãæãå¿
èŠã¯ãããŸããã ããããããã«ã¯æ¬ ç¹ããããŸãã Expressionsã䜿çšããéã«éåžžã«å°é£ãªã¿ã€ãã³ã°ããªããã°ãäœæããã³ãŒããæ£ããæ©èœãããã©ããã¯ããããŸããã ãããã£ãŠãRoslynã䜿çšãããšãExpressionsã§èšè¿°ãããã³ãŒãããããšã©ãŒãçºçããå¯èœæ§ãé«ããªããŸãã
ããã§ããRoslynã®å©ç¹ã¯çŽ æŽãããã§ãã èšèªå
šäœãã«ããŒããŠããŸããã€ãŸããä»»æã®ãã¶ã€ã³ãäœæã§ããŸãã ããšãã°ãå®è¡æã«æ°ããã¿ã€ããäœæããå¿
èŠãããå Žåã¯ãRoslynãåç
§ã§ããŸãã å®è¡æã«ååšããªããªããžã§ã¯ãã®DTOïŒããŒã¿è»¢éãªããžã§ã¯ãïŒãäœæãããšããŸãã AutoMapperã¯éåžžéçºäžã«äœ¿çšããããããAutoMapperã®å©ããåããããããŸããã äœæãããã¿ã€ãã¯ãããããç°ãªãã¿ã€ãã®ã€ãã³ãããã£ã«ã¿ãŒã§ããå¿
èŠããããŸãã Expressionãæå®ããå Žåã¯ãExpressionãäœæããŠããããã®ããŒã¿ã衚ãåãæäœããå¿
èŠããããŸãã ãããŠããããã®éã·ãªã¢ã«åã«ã¯ãDTOãå¿
èŠã§ãã
Roslynã䜿çšããŠã³ãŒããçæããæåã®æãç°¡åãªæ¹æ³ã¯ãAPIãåããããŒãµãŒã§ãã

ããã¹ããåæããæ§æããªãŒãäœæããŠãããŸããŸãªæäœãå®è¡ã§ããŸãã圢åŒã®å€æŽãçŸããã€ã³ãã³ãã®äœæã倿ãªã©ã§ãã APIã®ãªãã¡ã¯ã¿ãªã³ã°ã倿°ã®ååã®å€æŽããŸãã¯åŒã³åºãïŒ Console.WriteLine
ãConsole.Write
ãªã©ïŒã«çœ®ãæããå¿
èŠããããšããŸãã ãã¹ãŠããŒãããäœæãã代ããã«ãæ¢åã®ã³ãŒããèªã¿åã£ãŠãã³ãã¬ãŒããšããŠäœ¿çšããå¿
èŠãªãã®ã ãã眮ãæããããšãã§ããŸãã 蚪åè
ãã³ãã¬ãŒãã¯ããã®ç®çã«éåžžã«é©ããŠããŸãã ã¢ããªã±ãŒã·ã§ã³å
ã®ããã€ãã®ããŒã¯ã³ã«ã¢ã¯ã»ã¹ããŠãæ£ããããŒã¯ã³ãèŠã€ããããããã眮ãæããŸãã ã¹ã©ã€ããããããããã«ãæžåŒèšå®ã¯éåžžã«ç°¡åã§ãã
ãã®æ©èœãååã§ãªãå Žåã¯ãSyntaxGeneratorã䜿çšã§ããŸãã ããã¯åŒ·åãªé«ã¬ãã«APIã§ããããã®äžã«æ§æãã¡ã¯ããªããããŸãã åå空éãã¯ã©ã¹ã屿§ããã©ã¡ãŒã¿ãŒã宣èšã§ããŸããã€ãŸããæ¬æ Œçãªèšèªã§ãã ãŸãã node.AdjustWhitespace()
ã³ãã³ãã䜿çšãããšãããŒãéã«æšæºã®ã¹ããŒã¹ãäœæã§ããŸãã

æåã«ããã®ããŒã«ãã©ã®ããã«æ©èœãããã®ããã€ãã®äŸãèŠãŠã¿ãŸãããã æåã®ãã®ã§ã¯ã SyntaxFactory
ã䜿çšããããããSyntaxTrivia
ã QualifiedName
ã CompilationUnit
ã UsingDirective
ãŸãã ããã¯åŒããªãŒãããããã«æªããšèšããããããŸããã ãã ããããã«è¡šç€ºãããã®ã¯äœã¬ãã«APIã§ãã ç¥ã£ãŠãããšäŸ¿å©ã§ãããRoslyn SDKã䜿çšããŠèª¿ã¹ãããšãã§ããŸãã ããã§ã¯ãã³ãŒãã®æ§æããªãŒãã©ã®ããã«äœæãããããRoslynã®ããŒããã©ã®ããã«äºãã«çµåãããã確èªã§ããŸãã , , , , , -, , . , , .
, . . , , , , . , . -, . , . -, . - . .
Roslyn .


text
:

, ( text2
):

, StringBuilder
- .
.

:

PostProcess(SyntaxNode root)
. , LINQ , , . , Console.WriteLine
Console.Write
. Console.ReadKey()
. Console.Write
Console.ReadKey
.

, . .
.

, CodeGenerationHelper()
. SyntaxGenerator , , .

POCO DTO, .
, .

, ? , , , . . . , â . .

, , , , , DTO. , . , . , .
AddImplementINotifyPropertyChanged()
.


, result.DiagnosticReport
, INotifyPropertyChanged
.

, string _name
OnPropertyChanged()
, OnPropertyChanged
, [CallerMemberName]
â . . , . . GitHub, .
â ? , â , SyntaxGenerator. , , , . , . SimpleClassGenerator
.

, HashSet<PortableExecutableReference> Reference
, System.Runtime
. , .NET Core, .NET Framework, â .NET Core, .

SimpleClassGenerator
, IDictionary<string, Properties> Properties
, . GetSource()
, BuildClass()
, .

-, CreateProperty()
.

, , . , , . . backfield. . Accessor
.
. , IL? , , , Reflection.Emit
, . , . . x86-. , , . . - . , , « ». - , .
IL , , . , .dll, , . ILSpy . : , , . , . - , Visual Studio IL, . «F11», , .
, . , , . Mono.Cecil â . , , , , , . , . , GitHub , . , . , «F11» , IL, .
? sample1.dll
, DataHelper
, .

Employee
DTO. Person
, Printer
, . , , Main
, .

Start1
Person
. Start2
, -, , , , Printer
. , for-each ToList()
. Linq , `Enumerable .
, . AssemblyHooker
, (trap) .dll. VisualStudio Code, . , sample1.dll.

. , . , PlantUML ? , , , .

, . , . , . , , , WriteLine
, . : Program
, Person
, Console
. , .

Main
sample1.dll. . , . , , PlantUML . , Enumerable
, . . , . , , . Main
.
, , , IL . , -, , . IL .
, , , . , . : , , , . . ? . , , .
ãŸãšãããšã , . , â Roslyn Quoter . , , Roslyn, . , Roslyn Quoter , .
åºåã®åã ãããããåç¥ã®ããã«ãäŒè°ãè¡ã£ãŠããŸãã ä»åŸã® .NETäŒè°ã¯DotNext 2018 Piterã§ãã 2018幎4æ22ã23æ¥ããµã³ã¯ãããã«ãã«ã¯ã§éå¬ãããŸãã ã©ããªã¬ããŒãããããŸãã-YouTubeã®ã¢ãŒã«ã€ãã§èŠãããšãã§ããŸãã äŒè°ã§ã¯ãåã¬ããŒãã®åŸãç¹å¥ãªãã£ã¹ã«ãã·ã§ã³ãŸãŒã³ã§è¬æŒè
ãæé«ã®.NETãšãã¹ããŒããšã©ã€ããã£ãããè¡ãããšãã§ããŸãã èŠããã«ãç§ãã¡ã¯ããªããåŸ
ã£ãŠããŸãã