<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>CTRLALT313373.com - Extension Methods</title>
    <link>http://weblog.ctrlalt313373.com/</link>
    <description>.Net Wanderings</description>
    <language>en-us</language>
    <copyright>David A. Osborn</copyright>
    <lastBuildDate>Sun, 25 Nov 2007 16:03:26 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>davido@ctrlalt313373.com</managingEditor>
    <webMaster>davido@ctrlalt313373.com</webMaster>
    <item>
      <trackback:ping>http://weblog.ctrlalt313373.com/Trackback.aspx?guid=2a23d68a-6a35-4394-9a19-4cd80d64d900</trackback:ping>
      <pingback:server>http://weblog.ctrlalt313373.com/pingback.aspx</pingback:server>
      <pingback:target>http://weblog.ctrlalt313373.com/PermaLink,guid,2a23d68a-6a35-4394-9a19-4cd80d64d900.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://weblog.ctrlalt313373.com/CommentView,guid,2a23d68a-6a35-4394-9a19-4cd80d64d900.aspx</wfw:comment>
      <wfw:commentRss>http://weblog.ctrlalt313373.com/SyndicationService.asmx/GetEntryCommentsRss?guid=2a23d68a-6a35-4394-9a19-4cd80d64d900</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The other day I ran into the need to access a nested property on an object with the
actual name and path to the property stored in a string variable. For example I had
a mail object and wanted to access "From.DisplayName" which was stored in a string.
If I was access just the from I could have used something like this: 
</p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">using</span> System.Reflection;</span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:#2b91af">PropertyInfo</span>[]
pi = myObject.GetType().GetProperties(); </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">foreach</span> (<span style="color:#2b91af">PropertyInfo</span> item <span style="color:blue">in</span> pi) </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">if</span> (item.Name
= <span style="color:#a31515">"From"</span>) </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">object</span> o
= item.GetValue(myObject, <span style="color:blue">null</span>); </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
        </p>
        <p>
In this example myObject is the mail object and we first get the type of it, and then
get an array of the properties for that type. Finally we find the From property and
get the value for that property on our object. 
</p>
        <p>
Unfortunately this doesn't work for nested properties and I could not find a built
in way to do it so I built a recursive function to handle getting the property for
me and returning it. I then packaged it into a handy .Net 3.5 extension method. Let
me know if you know of a built in method to get a nested property, otherwise feel
free to using the extension method I put together, though it probably needs a bit
of refactoring before you put it into production. 
</p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">namespace</span> Common.ExtensionMethods </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">{ </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">public</span>
            <span style="color:blue">static</span>
            <span style="color:blue">class</span>
            <span style="color:#2b91af">TypeExtensionMethods </span>
          </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">public</span>
            <span style="color:blue">static</span>
            <span style="color:blue">object</span> GetNestedProperty(<span style="color:blue">this</span><span style="color:#2b91af">Type</span> t, <span style="color:#2b91af">Object</span> o, <span style="color:#2b91af">String</span> Property) </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">object</span> myObject
= <span style="color:blue">null</span>; </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:#2b91af">PropertyInfo</span>[]
pi = t.GetProperties(); </span>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">if</span> (Property.IndexOf(<span style="color:#a31515">"."</span>)
!= -1) </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">foreach</span> (<span style="color:#2b91af">PropertyInfo</span> item <span style="color:blue">in</span> pi) </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">if</span> (item.Name
== Property.Substring(0, Property.IndexOf(<span style="color:#a31515">"."</span>))) </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">object</span> tmpObj
= item.GetValue(o, <span style="color:blue">null</span>); </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> myObject = tmpObj.GetType().GetNestedProperty(tmpObj,
Property.Substring(Property.IndexOf(<span style="color:#a31515">"."</span>) + 1)); </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">else </span>
          </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">foreach</span> (<span style="color:#2b91af">PropertyInfo</span> item <span style="color:blue">in</span> pi) </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">if</span> (item.Name
== Property) </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> { </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> myObject = item.GetValue(o, <span style="color:blue">null</span>); </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">
            <span style="color:blue">return</span> myObject; </span>
        </p>
        <p>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt"> } </span>
        </p>
        <p>
          <span style="font-family:Courier New; font-size:10pt">} </span>
        </p>
        <img width="0" height="0" src="http://weblog.ctrlalt313373.com/aggbug.ashx?id=2a23d68a-6a35-4394-9a19-4cd80d64d900" />
      </body>
      <title>Accessing a Nested Property via a String</title>
      <guid isPermaLink="false">http://weblog.ctrlalt313373.com/PermaLink,guid,2a23d68a-6a35-4394-9a19-4cd80d64d900.aspx</guid>
      <link>http://weblog.ctrlalt313373.com/2007/11/25/AccessingANestedPropertyViaAString.aspx</link>
      <pubDate>Sun, 25 Nov 2007 16:03:26 GMT</pubDate>
      <description>&lt;p&gt;
The other day I ran into the need to access a nested property on an object with the
actual name and path to the property stored in a string variable. For example I had
a mail object and wanted to access "From.DisplayName" which was stored in a string.
If I was access just the from I could have used something like this: 
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;using&lt;/span&gt; System.Reflection;&lt;/span&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#2b91af"&gt;PropertyInfo&lt;/span&gt;[]
pi = myObject.GetType().GetProperties(); &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;PropertyInfo&lt;/span&gt; item &lt;span style="color:blue"&gt;in&lt;/span&gt; pi) &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;if&lt;/span&gt; (item.Name
= &lt;span style="color:#a31515"&gt;"From"&lt;/span&gt;) &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; o
= item.GetValue(myObject, &lt;span style="color:blue"&gt;null&lt;/span&gt;); &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
In this example myObject is the mail object and we first get the type of it, and then
get an array of the properties for that type. Finally we find the From property and
get the value for that property on our object. 
&lt;/p&gt;
&lt;p&gt;
Unfortunately this doesn't work for nested properties and I could not find a built
in way to do it so I built a recursive function to handle getting the property for
me and returning it. I then packaged it into a handy .Net 3.5 extension method. Let
me know if you know of a built in method to get a nested property, otherwise feel
free to using the extension method I put together, though it probably needs a bit
of refactoring before you put it into production. 
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;namespace&lt;/span&gt; Common.ExtensionMethods &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt;{ &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TypeExtensionMethods &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; GetNestedProperty(&lt;span style="color:blue"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt; t, &lt;span style="color:#2b91af"&gt;Object&lt;/span&gt; o, &lt;span style="color:#2b91af"&gt;String&lt;/span&gt; Property) &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; myObject
= &lt;span style="color:blue"&gt;null&lt;/span&gt;; &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:#2b91af"&gt;PropertyInfo&lt;/span&gt;[]
pi = t.GetProperties(); &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;if&lt;/span&gt; (Property.IndexOf(&lt;span style="color:#a31515"&gt;"."&lt;/span&gt;)
!= -1) &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;PropertyInfo&lt;/span&gt; item &lt;span style="color:blue"&gt;in&lt;/span&gt; pi) &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;if&lt;/span&gt; (item.Name
== Property.Substring(0, Property.IndexOf(&lt;span style="color:#a31515"&gt;"."&lt;/span&gt;))) &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt; tmpObj
= item.GetValue(o, &lt;span style="color:blue"&gt;null&lt;/span&gt;); &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; myObject = tmpObj.GetType().GetNestedProperty(tmpObj,
Property.Substring(Property.IndexOf(&lt;span style="color:#a31515"&gt;"."&lt;/span&gt;) + 1)); &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;else &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;PropertyInfo&lt;/span&gt; item &lt;span style="color:blue"&gt;in&lt;/span&gt; pi) &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;if&lt;/span&gt; (item.Name
== Property) &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; { &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; myObject = item.GetValue(o, &lt;span style="color:blue"&gt;null&lt;/span&gt;); &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; &lt;span style="color:blue"&gt;return&lt;/span&gt; myObject; &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt; } &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Courier New; font-size:10pt"&gt;} &lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://weblog.ctrlalt313373.com/aggbug.ashx?id=2a23d68a-6a35-4394-9a19-4cd80d64d900" /&gt;</description>
      <comments>http://weblog.ctrlalt313373.com/CommentView,guid,2a23d68a-6a35-4394-9a19-4cd80d64d900.aspx</comments>
      <category>Development</category>
      <category>Extension Methods</category>
    </item>
  </channel>
</rss>