{"id":291,"date":"2011-03-21T15:41:12","date_gmt":"2011-03-21T21:41:12","guid":{"rendered":"https:\/\/www.chrisedwards.dreamhosters.com\/blog\/?p=291"},"modified":"2011-09-18T20:48:06","modified_gmt":"2011-09-19T02:48:06","slug":"extension-toprintablestring-dynamically-print-an-object-and-its-properties","status":"publish","type":"post","link":"http:\/\/architester.com\/blog\/2011\/03\/21\/extension-toprintablestring-dynamically-print-an-object-and-its-properties\/","title":{"rendered":"Extension: ToPrintableString() dynamically print an object and its properties"},"content":{"rendered":"<p>Have you ever wanted to print out an object and all its property values to a log file or an error message? Have you overridden the <code>ToString()<\/code> method on all your objects to do this? If you have, you know how tedious it can be, and you will really appreciate this method.<\/p>\n<h3>What does it do?<\/h3>\n<p>Given:<\/p>\n<pre style=\"border:2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\"><span \r\n    style=\"color:#da4939;\">obj<\/span>&nbsp;<span style=\"color:#cc7833;\">=<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">new<\/span>&nbsp;TestClass();\r\n<span style=\"color:#da4939;\">obj<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color:#da4939;\">Value1<\/span>&nbsp;<span style=\"color:#cc7833;\">=<\/span>&nbsp;<span \r\n    style=\"color:#a5c261;\">&quot;abc&quot;<\/span>;\r\n<span style=\"color:#da4939;\">obj<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color:#da4939;\">Value2<\/span>&nbsp;<span style=\"color:#cc7833;\">=<\/span>&nbsp;<span \r\n    style=\"color:#a5c261;\">&quot;123&quot;<\/span>;<\/pre>\n<p>Callling:<\/p>\n<pre style=\"border:2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\"><span \r\n    style=\"color:#da4939;\">obj<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color: #ffc66d; background: #141e1e;\">ToPrintableString<\/span>();<\/pre>\n<p>Yeilds a string containing:<\/p>\n<pre style=\"border:2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\"><span \r\n    style=\"color:#a5c261;\">{{&nbsp;TestClass&nbsp;{&nbsp;Value1&nbsp;=&nbsp;[&nbsp;abc&nbsp;];&nbsp;Value2&nbsp;=&nbsp;[&nbsp;123&nbsp;];&nbsp;}&nbsp;}}<\/span><\/pre>\n<p>This is all generated dynamically with reflection. It will print out any properties with public getters. <\/p>\n<h3>The Code<\/h3>\n<p>The <code>ToPrintableString()<\/code> method does most of the work.<\/p>\n<pre style=\"border:2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\"><span \r\n    style=\"color:#cc7833;\">public<\/span>&nbsp;<span style=\"color:#cc7833;\">static<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">class<\/span>&nbsp;<span \r\n    style=\"color: #f3f3f3; background: #141e1e;\">ObjectExtensions<\/span>\r\n{\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">public<\/span>&nbsp;<span style=\"color:#cc7833;\">static<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">string<\/span>&nbsp;<span \r\n    style=\"color: #ffc66d; background: #141e1e;\">ToPrintableString<\/span><span \r\n    style=\"color:#cc7833;\">&lt;<\/span>&nbsp;<span style=\"color:#b9acee;\">T<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">&gt;<\/span>(&nbsp;<span style=\"color:#cc7833;\">this<\/span>&nbsp;<span \r\n    style=\"color:#b9acee;\">T<\/span>&nbsp;<span style=\"color:#d6cb8b;\">objectToPrint<\/span>&nbsp;)&nbsp;<span \r\n    style=\"color:#cc7833;\">where<\/span>&nbsp;<span style=\"color:#b9acee;\">T<\/span>&nbsp;:&nbsp;<span \r\n    style=\"color:#cc7833;\">class<\/span>\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;<span style=\"color:#b9b9ff;\">type<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">=<\/span>&nbsp;<span style=\"color:#cc7833;\">typeof<\/span>&nbsp;(&nbsp;<span \r\n    style=\"color:#b9acee;\">T<\/span>&nbsp;);\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">var<\/span>&nbsp;<span \r\n    style=\"color:#b9b9ff;\">sb<\/span>&nbsp;<span style=\"color:#cc7833;\">=<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">new<\/span>&nbsp;StringBuilder();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#b9b9ff;\">sb<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color:#ffc66d;\">AppendFormat<\/span>(&nbsp;<span style=\"color:#a5c261;\">&quot;{{{{&nbsp;{0}&nbsp;{{&nbsp;&quot;<\/span>,&nbsp;<span \r\n    style=\"color:#b9b9ff;\">type<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color:#da4939;\">Name<\/span>&nbsp;);\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">foreach<\/span>&nbsp;(&nbsp;PropertyInfo&nbsp;<span \r\n    style=\"font-weight:bold;color:#b9b9ff;\">property<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">in<\/span>&nbsp;<span style=\"color:#b9b9ff;\">type<\/span><span \r\n    style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color: #ffc66d; background: #141e1e;\">GetPublicGetProperties<\/span>()&nbsp;)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#b9b9ff;\">sb<\/span><span \r\n    style=\"color:#cc7833;\">.<\/span><span style=\"color:#ffc66d;\">AppendFormat<\/span>(&nbsp;<span \r\n    style=\"color:#a5c261;\">&quot;{0}&nbsp;=&nbsp;[&nbsp;{1}&nbsp;];&nbsp;&quot;<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"font-weight:bold;color:#b9b9ff;\">property<\/span><span \r\n    style=\"color:#cc7833;\">.<\/span><span style=\"color:#da4939;\">Name<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"font-weight:bold;color:#b9b9ff;\">property<\/span><span \r\n    style=\"color:#cc7833;\">.<\/span><span style=\"color:#ffc66d;\">GetValue<\/span>(&nbsp;<span \r\n    style=\"color:#d6cb8b;\">objectToPrint<\/span>,&nbsp;<span style=\"color:#cc7833;\">null<\/span>&nbsp;)&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#b9b9ff;\">sb<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color:#ffc66d;\">Append<\/span>(&nbsp;<span style=\"color:#a5c261;\">&quot;}&nbsp;}}&quot;<\/span>&nbsp;);\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">return<\/span>&nbsp;<span \r\n    style=\"color:#b9b9ff;\">sb<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color:#ffc66d;\">ToString<\/span>();\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n}<\/pre>\n<p>The <code>GetPublicGetProperties()<\/code> gets the properties with public getters. This method is part of my ReflectionExtensions class. I include it here for completeness.<\/p>\n<pre style=\"border: 2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\"><span \r\n    style=\"color:#cc7833;\">public<\/span>&nbsp;<span style=\"color:#cc7833;\">static<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">class<\/span>&nbsp;<span \r\n    style=\"color: #f3f3f3; background: #141e1e;\">ReflectionExtensions<\/span>\r\n{\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">public<\/span>&nbsp;<span style=\"color:#cc7833;\">static<\/span>&nbsp;PropertyInfo[]&nbsp;<span \r\n    style=\"color: #ffc66d; background: #141e1e;\">GetPublicGetProperties<\/span>(&nbsp;<span \r\n    style=\"color:#cc7833;\">this<\/span>&nbsp;Type&nbsp;<span style=\"color:#d6cb8b;\">type<\/span>&nbsp;)\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">return<\/span>&nbsp;<span \r\n    style=\"color:#d6cb8b;\">type<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color:#ffc66d;\">FindMembers<\/span>(&nbsp;<span style=\"color:#4f87cc;\">MemberTypes<\/span><span \r\n    style=\"color:#cc7833;\">.<\/span><span style=\"color:#6d9cbe;\">Property<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#4f87cc;\">BindingFlags<\/span><span \r\n    style=\"color:#cc7833;\">.<\/span><span style=\"color:#6d9cbe;\">Public<\/span>&nbsp;<span \r\n    style=\"color:#cc7833;\">|<\/span>&nbsp;<span style=\"color:#4f87cc;\">BindingFlags<\/span><span \r\n    style=\"color:#cc7833;\">.<\/span><span style=\"color:#6d9cbe;\">Instance<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;<span style=\"color:#d6cb8b;\">m<\/span>,&nbsp;<span \r\n    style=\"color:#d6cb8b;\">f<\/span>&nbsp;)&nbsp;<span style=\"color:#cc7833;\">=&gt;<\/span>&nbsp;(&nbsp;(PropertyInfo)<span \r\n    style=\"color:#d6cb8b;\">m<\/span>&nbsp;)<span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color:#da4939;\">CanRead<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">null<\/span>&nbsp;)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color: #ffc66d; background: #141e1e;\">Cast<\/span><span \r\n    style=\"color:#cc7833;\">&lt;<\/span>&nbsp;PropertyInfo&nbsp;<span style=\"color:#cc7833;\">&gt;<\/span>()\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">.<\/span><span \r\n    style=\"color: #ffc66d; background: #141e1e;\">ToArray<\/span>();\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n}<\/pre>\n<p>This code can be found in my <a href=\"https:\/\/github.com\/ChrisEdwards\/Shiloh.Testing\">Shiloh.Testing github repository<\/a>.<\/p>\n<p>Enjoy!<\/p>\n<p>-Chris<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Have you ever wanted to print out an object and all its property values to a log file or an error message? Have you overridden the ToString() method on all your objects to do this? If you have, you know how tedious it can be, and you will really appreciate this method. What does it [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,31],"tags":[79,30],"class_list":["post-291","post","type-post","status-publish","format-standard","hentry","category-net","category-c","tag-net","tag-csharp"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/comments?post=291"}],"version-history":[{"count":26,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/291\/revisions"}],"predecessor-version":[{"id":415,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/291\/revisions\/415"}],"wp:attachment":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/media?parent=291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/categories?post=291"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/tags?post=291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}