{"id":7142,"date":"2017-05-16T00:28:30","date_gmt":"2017-05-16T05:28:30","guid":{"rendered":"https:\/\/daedtech.wpenginepowered.com\/?p=7142"},"modified":"2017-05-16T00:28:32","modified_gmt":"2017-05-16T05:28:32","slug":"customizing-generated-method-header-comments","status":"publish","type":"post","link":"https:\/\/daedtech.com\/customizing-generated-method-header-comments\/","title":{"rendered":"Customizing Generated Method Header Comments"},"content":{"rendered":"<p><em>Editorial note: I originally wrote this post for the SubMain blog. \u00a0You can <a href=\"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx\">check out the original here, at their site<\/a>. \u00a0While you&#8217;re there, have a look at GhostDoc, the subject of this post.<\/em><\/p>\n<p>Last month, I wrote <a href=\"http:\/\/submain.com\/blog\/IntroToT4TemplatesGeneratingTextInAHurry.aspx\">a post introducing you to T4 templates<\/a>. \u00a0Near the end, I included a mention of GhostDoc&#8217;s use of T4 templates in automatically generating code comments. \u00a0Today, I&#8217;d like to expand on that.<\/p>\n<p>To recap very briefly, recall that Ghost Doc allows you to generate things like method header comments. \u00a0I recommend that, in most cases, you let it do its thing. \u00a0It does a good job. \u00a0But sometimes, you might have occasion to want to tweak the result. \u00a0And you can do that by making use of T4 Templates.<\/p>\n<h3>Documenting Chess TDD<\/h3>\n<p><a href=\"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6049\" src=\"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png\" alt=\"\" width=\"1440\" height=\"960\" srcset=\"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png 1440w, https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess-300x200.png 300w, https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess-768x512.png 768w, https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess-1024x683.png 1024w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><\/a><\/p>\n<p>To demonstrate, let&#8217;s revisit my trusty toy code base, <a href=\"https:\/\/github.com\/\">Chess TDD<\/a>. \u00a0Because I put this code together for instructional purposes and not to release as a product, it has no method header comments for Intellisense&#8217;s benefit. \u00a0This makes it the perfect candidate for a demonstration.<\/p>\n<p>If I had released this as a library, I&#8217;d have started the documentation with the Board class. \u00a0Most of the client interaction would happen via Board, so let&#8217;s document that. \u00a0It offers you a constructor and a bunch of semantics around placing and moving pieces. \u00a0Let&#8217;s document the conceptually simple &#8220;MovePiece&#8221; method.<\/p>\n<p><!--more--><\/p>\n<pre class=\"lang:c# decode:true \">public void MovePiece(BoardCoordinate origin, BoardCoordinate destination)\r\n{\r\n    VerifyCoordinatesOrThrow(origin, destination);\r\n\r\n    var pieceToMove = GetPiece(origin);\r\n    AddPiece(pieceToMove, destination);\r\n    RemovePiece(origin);\r\n    pieceToMove.HasMoved = true;\r\n\r\n    ReconcileEnPassant(origin, destination, pieceToMove);\r\n}<\/pre>\n<p>To add documentation to this method, I simply right click it and, from the GhostDoc context menu, select &#8220;Document This.&#8221; \u00a0Alternatively, I can use the keyboard shortcut Ctrl-Shift-D. \u00a0Either option yields the following result.<\/p>\n<pre class=\"lang:c# decode:true \">\/\/\/ &lt;summary&gt;\r\n\/\/\/ Moves the piece.\r\n\/\/\/ &lt;\/summary&gt;\r\n\/\/\/ &lt;param name=\"origin\"&gt;The origin.&lt;\/param&gt;\r\n\/\/\/ &lt;param name=\"destination\"&gt;The destination.&lt;\/param&gt;\r\npublic void MovePiece(BoardCoordinate origin, BoardCoordinate destination)\r\n{\r\n    VerifyCoordinatesOrThrow(origin, destination);\r\n\r\n    var pieceToMove = GetPiece(origin);\r\n    AddPiece(pieceToMove, destination);\r\n    RemovePiece(origin);\r\n    pieceToMove.HasMoved = true;\r\n\r\n    ReconcileEnPassant(origin, destination, pieceToMove);\r\n}<\/pre>\n<h3>Let&#8217;s Make a Tiny Tweak<\/h3>\n<p>Alright,\u00a0much better! \u00a0If I scrutinize the comment, I can imagine what an intellisense-using client will see. \u00a0My parameter naming makes this conceptually simple to understand, so the intellisense will tell the user that the first parameter represents the origin square and the second parameter the destination.<\/p>\n<p>But let&#8217;s say that as I look at this, I find myself wanting to pick at a nit. \u00a0I don&#8217;t care for the summary taking up three lines &#8212; I want to condense it to one. \u00a0How might I do that?<\/p>\n<p>Well, let&#8217;s crack open the T4 template for generating a method header. \u00a0Recall that you do this in Visual Studio by selecting Tools-&gt;Ghost Doc-&gt;Options, and picking &#8220;Rules&#8221; from the options pane.<\/p>\n<p><a href=\"https:\/\/daedtech.com\/customizing-generated-method-header-comments\/ghostdocrules\/\" rel=\"attachment wp-att-7143\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-7143\" src=\"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/12\/GhostDocRules.png\" alt=\"\" width=\"602\" height=\"515\" srcset=\"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/12\/GhostDocRules.png 602w, https:\/\/daedtech.com\/wp-content\/uploads\/2016\/12\/GhostDocRules-300x257.png 300w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/a><\/p>\n<p>If you double click on &#8220;Method Template&#8221;, as highlighted above, you will see an &#8220;Edit Rule&#8221; Window. \u00a0The first few lines of code in that window look like this.<\/p>\n<pre class=\"lang:default decode:true \">&lt;#@ template language=\"C#\" #&gt;\r\n&lt;#  CodeElement codeElement = Context.CurrentCodeElement; #&gt;\r\n\/\/\/ &lt;summary&gt;\r\n\/\/\/&lt;# GenerateSummaryText(); #&gt;\r\n\/\/\/ &lt;\/summary&gt;\r\n&lt;#\tif(codeElement.HasTypeParameters) \r\n\t{\r\n\t\tfor(int i = 0; i &lt; codeElement.TypeParameters.Length; i++) \r\n\t\t{ \r\n\t\t\tTypeParameter typeParameter = codeElement.TypeParameters[i]; \r\n#&gt;<\/pre>\n<p>Hmmm. \u00a0I cannot count myself an expert in T4 templates, <em>per se,\u00a0<\/em>but I think I have an idea. \u00a0Let&#8217;s put that call to GenerateSummaryText() inline between the summary tags. \u00a0Like this.<\/p>\n<pre class=\"lang:default decode:true \">&lt;#@ template language=\"C#\" #&gt;\r\n&lt;#  CodeElement codeElement = Context.CurrentCodeElement; #&gt;\r\n\/\/\/ &lt;summary&gt;&lt;# GenerateSummaryText(); #&gt;&lt;\/summary&gt;<\/pre>\n<p>That should do it, right? \u00a0Let&#8217;s regenerate the comment and see what it looks like. \u00a0This results in the following.<\/p>\n<pre class=\"lang:c# decode:true \">\/\/\/ &lt;summary&gt;Moves the piece.\r\n\/\/\/ &lt;\/summary&gt;\r\n\/\/\/ &lt;param name=\"origin\"&gt;The origin.&lt;\/param&gt;\r\n\/\/\/ &lt;param name=\"destination\"&gt;The destination.&lt;\/param&gt;\r\npublic void MovePiece(BoardCoordinate origin, BoardCoordinate destination)\r\n{\r\n    VerifyCoordinatesOrThrow(origin, destination);\r\n\r\n    var pieceToMove = GetPiece(origin);\r\n    AddPiece(pieceToMove, destination);\r\n    RemovePiece(origin);\r\n    pieceToMove.HasMoved = true;\r\n\r\n    ReconcileEnPassant(origin, destination, pieceToMove);\r\n}<\/pre>\n<p>Uh, oh. \u00a0It made a difference, but somehow we only got halfway there. \u00a0Why might that be?<\/p>\n<h3>Diving Deeper<\/h3>\n<p>To understand, we need to look at the template in a bit more detail. \u00a0The template itself has everything on one line, and yet we see a newline in there somehow. \u00a0Could GenerateTextSummary cause this, somehow? \u00a0Let&#8217;s scroll down to look at it. \u00a0Since this method has a lot of code, here are the first few lines only.<\/p>\n<pre class=\"lang:c# decode:true\">private void GenerateSummaryText()\r\n{\r\n\tif(Context.HasExistingTagText(\"summary\"))\r\n\t{\r\n\t\tthis.WriteLine(Context.GetExistingTagText(\"summary\"));\r\n\t}\r\n\telse if(IsAsyncMethod())\r\n\t{\r\n\t\tthis.WriteLine(Context.ExecMacro(\"$(MethodName.Words.ExceptLast)\") + \" as an asynchronous operation.\");\r\n\t}\r\n\telse if(IsMainMethod())\r\n\t{\r\n\t\tthis.WriteLine(\"Defines the entry point of the application.\");        \r\n\t}\r\n<\/pre>\n<p>Aha! \u00a0Notice that we&#8217;re calling Write<span style=\"text-decoration: underline;\">Line.<\/span> \u00a0What if we did a find and replace to change all of those to just Write? \u00a0Let&#8217;s try. \u00a0(To do more serious operations like this, you will want to copy the text out of the editor and into your favorite text editor in order to get more operations).<\/p>\n<p>Once you have replaced all instances of WriteLine with Write in the template, here is the new result.<\/p>\n<pre class=\"lang:c# decode:true \">\/\/\/ &lt;summary&gt;Moves the piece.&lt;\/summary&gt;\r\n\/\/\/ &lt;param name=\"origin\"&gt;The origin.&lt;\/param&gt;\r\n\/\/\/ &lt;param name=\"destination\"&gt;The destination.&lt;\/param&gt;\r\npublic void MovePiece(BoardCoordinate origin, BoardCoordinate destination)\r\n{\r\n    VerifyCoordinatesOrThrow(origin, destination);\r\n\r\n    var pieceToMove = GetPiece(origin);\r\n    AddPiece(pieceToMove, destination);\r\n    RemovePiece(origin);\r\n    pieceToMove.HasMoved = true;\r\n\r\n    ReconcileEnPassant(origin, destination, pieceToMove);\r\n}<\/pre>\n<p>Success!<\/p>\n<h3>Validation<\/h3>\n<p>As you play with this, you might have noticed a &#8220;validate&#8221; button in the rule editor. \u00a0Use this liberally! \u00a0This button will trigger a parsing of the template and provide you with feedback as to validity. \u00a0The last thing you want to do is work in here for many iterations and wind up with no idea what you broke and when.<\/p>\n<p>When working with these templates, think of this as equivalent to compiling. \u00a0You wouldn&#8217;t want to sit for 20 minutes writing code with no feedback as to whether it builds or not. \u00a0So don&#8217;t do it with these templates.<\/p>\n<h3>The Power at Your Disposal<\/h3>\n<p>I&#8217;ll wrap here for this particular lesson, but understand that we have barely scratched the surface of what you can do. \u00a0In this post, we just changed a bit of the formatting to suit a whim I had. \u00a0But you can really dive into ways of reasoning about and documenting the code if you so choose.<\/p>\n<p>Stay tuned for future posts on more advanced tips and tricks with your comment templates.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Editorial note: I originally wrote this post for the SubMain blog. \u00a0You can check out the original here, at their site. \u00a0While you&#8217;re there, have a look at GhostDoc, the subject of this post. Last month, I wrote a post introducing you to T4 templates. \u00a0Near the end, I included a mention of GhostDoc&#8217;s use&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[67],"tags":[10,155,219,216],"class_list":["post-7142","post","type-post","status-publish","format-standard","hentry","category-net","tag-c","tag-chesstdd","tag-ghostdoc","tag-submain"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Customizing Generated Method Header Comments - DaedTech<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Customizing Generated Method Header Comments - DaedTech\" \/>\n<meta name=\"twitter:description\" content=\"Editorial note: I originally wrote this post for the SubMain blog. \u00a0You can check out the original here, at their site. \u00a0While you&#8217;re there, have a look at GhostDoc, the subject of this post. Last month, I wrote a post introducing you to T4 templates. \u00a0Near the end, I included a mention of GhostDoc&#8217;s use...\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Erik Dietrich\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/customizing-generated-method-header-comments\\\/\"},\"author\":{\"name\":\"Erik Dietrich\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#\\\/schema\\\/person\\\/3dae63e91a0fa60c8051a2171fa687d2\"},\"headline\":\"Customizing Generated Method Header Comments\",\"datePublished\":\"2017-05-16T05:28:30+00:00\",\"dateModified\":\"2017-05-16T05:28:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/customizing-generated-method-header-comments\\\/\"},\"wordCount\":821,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/#organization\"},\"image\":{\"@id\":\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2016\\\/02\\\/HighFiveChess.png\",\"keywords\":[\"C#\",\"ChessTDD\",\"GhostDoc\",\"SubMain\"],\"articleSection\":[\".NET\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/customizing-generated-method-header-comments\\\/\",\"url\":\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx\",\"name\":\"Customizing Generated Method Header Comments - DaedTech\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2016\\\/02\\\/HighFiveChess.png\",\"datePublished\":\"2017-05-16T05:28:30+00:00\",\"dateModified\":\"2017-05-16T05:28:32+00:00\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx#primaryimage\",\"url\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2016\\\/02\\\/HighFiveChess.png\",\"contentUrl\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2016\\\/02\\\/HighFiveChess.png\",\"width\":1440,\"height\":960},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/community.submain.com\\\/blogs\\\/submain\\\/archive\\\/2017\\\/01\\\/03\\\/ghostdoc-customizing-generated-method-header-comments.aspx#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/daedtech.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Customizing Generated Method Header Comments\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#website\",\"url\":\"https:\\\/\\\/daedtech.com\\\/\",\"name\":\"DaedTech\",\"description\":\"Stories about Software\",\"publisher\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/daedtech.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#organization\",\"name\":\"DaedTech LLC\",\"url\":\"https:\\\/\\\/daedtech.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2015\\\/07\\\/SmallLogo.jpg\",\"contentUrl\":\"https:\\\/\\\/daedtech.com\\\/wp-content\\\/uploads\\\/2015\\\/07\\\/SmallLogo.jpg\",\"width\":82,\"height\":84,\"caption\":\"DaedTech LLC\"},\"image\":{\"@id\":\"https:\\\/\\\/daedtech.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/daedtech.com\\\/#\\\/schema\\\/person\\\/3dae63e91a0fa60c8051a2171fa687d2\",\"name\":\"Erik Dietrich\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg\",\"caption\":\"Erik Dietrich\"},\"sameAs\":[\"https:\\\/\\\/daedtech.com\"],\"url\":\"https:\\\/\\\/daedtech.com\\\/author\\\/erik\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Customizing Generated Method Header Comments - DaedTech","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx","twitter_card":"summary_large_image","twitter_title":"Customizing Generated Method Header Comments - DaedTech","twitter_description":"Editorial note: I originally wrote this post for the SubMain blog. \u00a0You can check out the original here, at their site. \u00a0While you&#8217;re there, have a look at GhostDoc, the subject of this post. Last month, I wrote a post introducing you to T4 templates. \u00a0Near the end, I included a mention of GhostDoc&#8217;s use...","twitter_image":"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png","twitter_misc":{"Written by":"Erik Dietrich","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx#article","isPartOf":{"@id":"https:\/\/daedtech.com\/customizing-generated-method-header-comments\/"},"author":{"name":"Erik Dietrich","@id":"https:\/\/daedtech.com\/#\/schema\/person\/3dae63e91a0fa60c8051a2171fa687d2"},"headline":"Customizing Generated Method Header Comments","datePublished":"2017-05-16T05:28:30+00:00","dateModified":"2017-05-16T05:28:32+00:00","mainEntityOfPage":{"@id":"https:\/\/daedtech.com\/customizing-generated-method-header-comments\/"},"wordCount":821,"commentCount":2,"publisher":{"@id":"https:\/\/daedtech.com\/#organization"},"image":{"@id":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx#primaryimage"},"thumbnailUrl":"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png","keywords":["C#","ChessTDD","GhostDoc","SubMain"],"articleSection":[".NET"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx#respond"]}]},{"@type":"WebPage","@id":"https:\/\/daedtech.com\/customizing-generated-method-header-comments\/","url":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx","name":"Customizing Generated Method Header Comments - DaedTech","isPartOf":{"@id":"https:\/\/daedtech.com\/#website"},"primaryImageOfPage":{"@id":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx#primaryimage"},"image":{"@id":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx#primaryimage"},"thumbnailUrl":"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png","datePublished":"2017-05-16T05:28:30+00:00","dateModified":"2017-05-16T05:28:32+00:00","breadcrumb":{"@id":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx#primaryimage","url":"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png","contentUrl":"https:\/\/daedtech.com\/wp-content\/uploads\/2016\/02\/HighFiveChess.png","width":1440,"height":960},{"@type":"BreadcrumbList","@id":"http:\/\/community.submain.com\/blogs\/submain\/archive\/2017\/01\/03\/ghostdoc-customizing-generated-method-header-comments.aspx#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/daedtech.com\/"},{"@type":"ListItem","position":2,"name":"Customizing Generated Method Header Comments"}]},{"@type":"WebSite","@id":"https:\/\/daedtech.com\/#website","url":"https:\/\/daedtech.com\/","name":"DaedTech","description":"Stories about Software","publisher":{"@id":"https:\/\/daedtech.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/daedtech.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/daedtech.com\/#organization","name":"DaedTech LLC","url":"https:\/\/daedtech.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/daedtech.com\/#\/schema\/logo\/image\/","url":"https:\/\/daedtech.com\/wp-content\/uploads\/2015\/07\/SmallLogo.jpg","contentUrl":"https:\/\/daedtech.com\/wp-content\/uploads\/2015\/07\/SmallLogo.jpg","width":82,"height":84,"caption":"DaedTech LLC"},"image":{"@id":"https:\/\/daedtech.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/daedtech.com\/#\/schema\/person\/3dae63e91a0fa60c8051a2171fa687d2","name":"Erik Dietrich","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/691ca004bd18f464e9467b2f838e8fbc7a9a2c9eb8568b04a834ac653f3ab1d7?s=96&d=wavatar&r=pg","caption":"Erik Dietrich"},"sameAs":["https:\/\/daedtech.com"],"url":"https:\/\/daedtech.com\/author\/erik\/"}]}},"_links":{"self":[{"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/posts\/7142","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/comments?post=7142"}],"version-history":[{"count":0,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/posts\/7142\/revisions"}],"wp:attachment":[{"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/media?parent=7142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/categories?post=7142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daedtech.com\/wp-json\/wp\/v2\/tags?post=7142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}