<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Sean McCarthy's Blog</title>
	<atom:link href="http://scmccart.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://scmccart.wordpress.com</link>
	<description>Putting the ? in What?</description>
	<lastBuildDate>Thu, 22 Oct 2009 19:19:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='scmccart.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Sean McCarthy's Blog</title>
		<link>http://scmccart.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://scmccart.wordpress.com/osd.xml" title="Sean McCarthy&#039;s Blog" />
	<atom:link rel='hub' href='http://scmccart.wordpress.com/?pushpress=hub'/>
		<item>
		<title>C#: A Method for Tail Call Recursion</title>
		<link>http://scmccart.wordpress.com/2009/10/22/c-a-method-for-tail-call-recursion/</link>
		<comments>http://scmccart.wordpress.com/2009/10/22/c-a-method-for-tail-call-recursion/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 19:16:18 +0000</pubDate>
		<dc:creator>scmccart</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[codeproject]]></category>

		<guid isPermaLink="false">http://scmccart.wordpress.com/2009/10/22/c-a-method-for-tail-call-recursion/</guid>
		<description><![CDATA[I’ve been reading on F# a bit, and came across it’s ability to do tail call recursion. Tail recursion as defined by Wikipedia: In computer science, tail recursion (or tail-end recursion) is a special case of recursion in which the last operation of the function, the tail call, is a recursive call. Such recursions can [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=29&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I’ve been reading on F# a bit, and came across it’s ability to do tail call recursion. Tail recursion as defined by <a href="http://en.wikipedia.org/wiki/Tail_recursion" target="_blank">Wikipedia</a>:</p>
<blockquote><p>In <a href="http://en.wikipedia.org/wiki/Computer_science">computer science</a>, tail recursion (or tail-end recursion) is a special case of <a href="http://en.wikipedia.org/wiki/Recursion_%28computer_science%29">recursion</a> in which the last operation of the function, the <a href="http://en.wikipedia.org/wiki/Tail_call">tail call</a>, is a recursive call. Such recursions can be easily transformed to iterations. Replacing recursion with <a href="http://en.wikipedia.org/wiki/Iteration">iteration</a>, manually or automatically, can drastically decrease the amount of <a href="http://en.wikipedia.org/wiki/Call_stack">stack</a> space used and improve efficiency. This technique is commonly used with <a href="http://en.wikipedia.org/wiki/Functional_programming">functional programming</a> languages, where the <a href="http://en.wikipedia.org/wiki/Declarative_programming">declarative approach</a> and explicit handling of <a href="http://en.wikipedia.org/wiki/State_%28computer_science%29">state</a> promote the use of recursive functions that would otherwise rapidly fill the <a href="http://en.wikipedia.org/wiki/Call_stack">call stack</a>.</p>
</blockquote>
<p>So, I decided to see if I could implement this in C#, and after a little bit of monkeying around I was able to get something working.</p>
<p>First off, I needed two helper classes, the first of which is the Ref&lt;T&gt; class. It makes it possible to keep track of a reference to an object across closures. There is also an implicit conversion back to the type it is referencing for convenience.
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e3f514d1-6eec-416a-959d-d35e9f1f7b61" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">Ref</span>&lt;T&gt;<br /> {<br /> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> T Value { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">implicit</span> <span style="color:#0000ff;">operator</span> T(<span style="color:#2b91af;">Ref</span>&lt;T&gt; obj)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> obj.Value;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> } </div>
</p></div>
</p></div>
</p>
<p> Next was the LazyRef&lt;T&gt;, which is the same as Ref&lt;T&gt; but won’t actually compute the value until it is needed.
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b301fea4-1796-4579-95c6-dfa3e395c24e" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">LazyRef</span>&lt;T&gt;<br /> {<br /> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> T Value { <span style="color:#0000ff;">get</span> { <span style="color:#0000ff;">return</span> Factory(); } }<br /> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#2b91af;">Func</span>&lt;T&gt; Factory { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> LazyRef()<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> LazyRef(<span style="color:#2b91af;">Func</span>&lt;T&gt; factory)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">this</span>.Factory = factory;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">implicit</span> <span style="color:#0000ff;">operator</span> T(<span style="color:#2b91af;">LazyRef</span>&lt;T&gt; obj)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> obj.Value;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">implicit</span> <span style="color:#0000ff;">operator</span> <span style="color:#2b91af;">LazyRef</span>&lt;T&gt;(T obj)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">LazyRef</span>&lt;T&gt;(() =&gt; obj);<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> } </div>
</p></div>
</p></div>
</p>
<p> Alright, now all that remains is the method that does all of the magic, I’ll present it piecewise then all together at the end. First, let’s look at the method’s signature,
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9ce6054a-6443-401a-bc3e-58141d2f1541" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#2b91af;">Func</span>&lt;T, R&gt; ToTailCall&lt;T, R&gt;(<br /> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">this</span> <span style="color:#2b91af;">Func</span>&lt;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#2b91af;">LazyRef</span>&lt;R&gt;&gt;, T, <span style="color:#2b91af;">LazyRef</span>&lt;R&gt;&gt; target) </div>
</p></div>
</p></div>
</p>
<p>It will return a delegate that represents the tail call optimized method, taking a T as the only parameter and returning an R. The only argument is the target method/delegate to be transformed. Note that the target takes a delegate as it’s first argument, this will be the recurse function that the method will call instead of itself when it wishes to proceed. It then takes a T, and returns a LazyRef to an R.</p>
<p>Now for the first part of the method, just some Ref and LazyRef variables, I’ll explain these as they are used.
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5e4953cc-cf28-4c12-820f-4d66d7d4e964" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">var</span> calledRef = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Ref</span>&lt;<span style="color:#0000ff;">bool</span>&gt;();<br /> <span style="color:#0000ff;">var</span> paramRef = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Ref</span>&lt;T&gt;();<br /> <span style="color:#0000ff;">var</span> currResult = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Ref</span>&lt;<span style="color:#2b91af;">LazyRef</span>&lt;R&gt;&gt;();<br /> <span style="color:#0000ff;">var</span> lazyResult = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">LazyRef</span>&lt;R&gt;(<br /> &nbsp;&nbsp;&nbsp;&nbsp;() =&gt; currResult.Value.Value); </div>
</p></div>
</p></div>
</p>
<p>Next up is setRef, it’s the function that will be the recurse function that is passed in as the first argument when target is called.
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9c52b83a-fe1d-4b7d-a070-bb226f6af649" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#2b91af;">LazyRef</span>&lt;R&gt;&gt; setRef = t =&gt; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;calledRef.Value = <span style="color:#0000ff;">true</span>;<br /> &nbsp;&nbsp;&nbsp;&nbsp;paramRef.Value = t;<br /> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> lazyResult;<br /> }; </div>
</p></div>
</p></div>
</p>
<p>setRef first flips the calledRef flag, so that we know that target wants to do one more recursion, then we store off the value that target wanted to pass on, and we return the lazyResult. lazyResult will return currResult’s value when asked what it’s value is.</p>
<p>Next, is the actual function that is returned,
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0a0d24b2-6eab-4a91-8b85-55d13f441193" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">return</span> t =&gt; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;paramRef.Value = t;</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">do</span><br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calledRef.Value = <span style="color:#0000ff;">false</span>;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currResult.Value = target(setRef, paramRef.Value);<br /> &nbsp;&nbsp;&nbsp;&nbsp;} <span style="color:#0000ff;">while</span> (calledRef.Value);</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> lazyResult.Value;<br /> }; </div>
</p></div>
</p></div>
</p>
<p>First off, it sets up the current parameter value as t, since it needs to be set for the first iteration. Then it enters the loop and flips the calledRef flag to false, so if target doesn’t call the recurse function the loop will not continue. After that target is called, passing in setRef as the recurse function, and the current parameter value. It’s return is stored as the currentResult which will be lazyResult until target doesn’t call the recurse function, at which point it will return something else. This goes on until target doesn’t call the recurse function and the loop exits. After that we return the value or lazyResult, which is the value or currentResult. Ok, so here is everything all together:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6dcec1eb-adff-4e0c-ba45-ab613b1d67ea" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">Recursion</span><br /> {<br /> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#2b91af;">Func</span>&lt;T, R&gt; ToTailCall&lt;T, R&gt;(<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">this</span> <span style="color:#2b91af;">Func</span>&lt;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#2b91af;">LazyRef</span>&lt;R&gt;&gt;, T, <span style="color:#2b91af;">LazyRef</span>&lt;R&gt;&gt; target)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> calledRef = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Ref</span>&lt;<span style="color:#0000ff;">bool</span>&gt;();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> paramRef = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Ref</span>&lt;T&gt;();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> currResult = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Ref</span>&lt;<span style="color:#2b91af;">LazyRef</span>&lt;R&gt;&gt;();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> lazyResult = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">LazyRef</span>&lt;R&gt;(<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;() =&gt; currResult.Value.Value);</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#2b91af;">LazyRef</span>&lt;R&gt;&gt; setRef = t =&gt; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calledRef.Value = <span style="color:#0000ff;">true</span>;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paramRef.Value = t;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> lazyResult;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> t =&gt; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paramRef.Value = t;</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">do</span><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calledRef.Value = <span style="color:#0000ff;">false</span>;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currResult.Value = target(setRef, paramRef.Value);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <span style="color:#0000ff;">while</span> (calledRef.Value);</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> lazyResult.Value;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> } </div>
</p></div>
</p></div>
<p>&#160;</p>
<p>All of the refs end up in closures in either setRef or the return value, so the values they reference can be shared and changed. Having the current result be lazy in itself makes the whole thing possible. If we didn’t have LazyRef target would be expecting a computed value to be returned from recurse which would require actual recursion.</p>
<p>Time for a quick example, this will run until the x overflows:</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:40e36219-3c7a-4a36-8ee5-879f66e12821" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> Main(<span style="color:#0000ff;">string</span>[] args)<br /> {<br /> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> tailFoo = <span style="color:#2b91af;">Recursion</span>.ToTailCall&lt;<span style="color:#0000ff;">int</span>, <span style="color:#0000ff;">int</span>&gt;((recurse, x) =&gt; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">try</span><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Console</span>.WriteLine(x);</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> recurse(x + <span style="color:#a52a2a;">1</span>);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">catch</span> (<span style="color:#2b91af;">OverflowException</span>)<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> x;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> &nbsp;&nbsp;&nbsp;&nbsp;});</p>
<p> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Console</span>.WriteLine(<span style="color:#a31515;">&#8220;Done, {0} was the result.&#8221;</span>, tailFoo(<span style="color:#a52a2a;">0</span>));<br /> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Console</span>.ReadLine();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> } </div>
</p></div>
</p></div>
<p>&#160;</p>
<p>Feel free to post questions and comments.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scmccart.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scmccart.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scmccart.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scmccart.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/scmccart.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/scmccart.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/scmccart.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/scmccart.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scmccart.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scmccart.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scmccart.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scmccart.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scmccart.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scmccart.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=29&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://scmccart.wordpress.com/2009/10/22/c-a-method-for-tail-call-recursion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bbe2e647579a4d24ddfe09815b214408?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scmccart</media:title>
		</media:content>
	</item>
		<item>
		<title>C# 4.0: Exposer, an evil DynamicObject</title>
		<link>http://scmccart.wordpress.com/2009/10/08/c-4-0-exposer-an-evil-dynamicobject/</link>
		<comments>http://scmccart.wordpress.com/2009/10/08/c-4-0-exposer-an-evil-dynamicobject/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 15:24:54 +0000</pubDate>
		<dc:creator>scmccart</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Evil]]></category>
		<category><![CDATA[codeproject]]></category>

		<guid isPermaLink="false">http://scmccart.wordpress.com/?p=21</guid>
		<description><![CDATA[This class makes every field, property, or method on the wrapped object visible when using it as a dynamic. This version is not thread safe, for the sake of brevity I removed all of the locks. To use, you only need to add this to your project, then call .Expose() on an instance of some [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=21&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This class makes every field, property, or method on the wrapped object visible when using it as a dynamic. This version is not thread safe, for the sake of brevity I removed all of the locks. To use, you only need to add this to your project, then call .Expose() on an instance of some object, then assign that to a dynamic variable, like so:</p>
<p>dynamic x = someInstance.Expose();</p>
<p>You may then access any field, property, or method regardless of it’s visibility level. Feel free to comment with questions if anything needs explanation <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>&#160;</p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f107ac83-d851-4bab-ad19-5dde769232c1" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background:#ddd;max-height:300px;overflow:auto;">
<ol style="background:#ffffff;margin:0 0 0 3em;padding:0 0 0 5px;">
<li><span style="color:#0000ff;">using</span> System;</li>
<li style="background:#f3f3f3;"><span style="color:#0000ff;">using</span> System.Collections.Generic;</li>
<li><span style="color:#0000ff;">using</span> System.Dynamic;</li>
<li style="background:#f3f3f3;"><span style="color:#0000ff;">using</span> System.Linq;</li>
<li><span style="color:#0000ff;">using</span> System.Linq.Expressions;</li>
<li style="background:#f3f3f3;"><span style="color:#0000ff;">using</span> System.Reflection;</li>
<li><span style="color:#0000ff;">using</span> System.Text;</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li><span style="color:#0000ff;">namespace</span> Evil</li>
<li style="background:#f3f3f3;">{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> <span style="color:#2b91af;">IConvertTo</span>&lt;T&gt;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T Convert();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> <span style="color:#2b91af;">IObjectWithType</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Type</span> Type { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">Exposer</span>&lt;T&gt; : <span style="color:#2b91af;">DynamicObject</span>, <span style="color:#2b91af;">IObjectWithType</span>, <span style="color:#2b91af;">IConvertTo</span>&lt;T&gt;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> T Object { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#2b91af;">Type</span> Type { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">static</span> <span style="color:#2b91af;">Dictionary</span>&lt;<span style="color:#0000ff;">string</span>, <span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>[], <span style="color:#0000ff;">object</span>&gt;&gt; _methods = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Dictionary</span>&lt;<span style="color:#0000ff;">string</span>, <span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>[], <span style="color:#0000ff;">object</span>&gt;&gt;();</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">static</span> <span style="color:#2b91af;">Dictionary</span>&lt;<span style="color:#0000ff;">string</span>, <span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>&gt;&gt; _getters = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Dictionary</span>&lt;<span style="color:#0000ff;">string</span>, <span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>&gt;&gt;();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">static</span> <span style="color:#2b91af;">Dictionary</span>&lt;<span style="color:#0000ff;">string</span>, <span style="color:#2b91af;">Action</span>&lt;T, <span style="color:#0000ff;">object</span>&gt;&gt; _setters = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Dictionary</span>&lt;<span style="color:#0000ff;">string</span>, <span style="color:#2b91af;">Action</span>&lt;T, <span style="color:#0000ff;">object</span>&gt;&gt;();</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">static</span> <span style="color:#2b91af;">MethodInfo</span> _doConvert = <span style="color:#0000ff;">typeof</span>(<span style="color:#2b91af;">Exposer</span>&lt;T&gt;).GetMethod(<span style="color:#a31515;">&#8220;DoConvert&#8221;</span>, <span style="color:#2b91af;">BindingFlags</span>.NonPublic | <span style="color:#2b91af;">BindingFlags</span>.Static);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> Exposer(T obj)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">this</span>.Object = obj;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">this</span>.Type = obj.GetType();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">bool</span> TryGetMember(<span style="color:#2b91af;">GetMemberBinder</span> binder, <span style="color:#0000ff;">out</span> <span style="color:#0000ff;">object</span> result)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> key = binder.Name;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>&gt; getter = <span style="color:#0000ff;">null</span>;</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (_getters.ContainsKey(key))</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getter = _getters[key];</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">else</span></li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">IEnumerable</span>&lt;<span style="color:#2b91af;">MemberInfo</span>&gt; members = <span style="color:#0000ff;">this</span>.Type.GetMembers(</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">BindingFlags</span>.Instance | <span style="color:#2b91af;">BindingFlags</span>.Public | <span style="color:#2b91af;">BindingFlags</span>.NonPublic | <span style="color:#2b91af;">BindingFlags</span>.GetProperty | <span style="color:#2b91af;">BindingFlags</span>.GetField);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;members = <span style="color:#0000ff;">from</span> mem <span style="color:#0000ff;">in</span> members</li>
<li>&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:#0000ff;">where</span> mem.Name == key</li>
<li style="background:#f3f3f3;">&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:#0000ff;">select</span> mem;</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> member = members.FirstOrDefault();</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (member != <span style="color:#0000ff;">null</span>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getter = BuildGetter(member);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_getters.Add(key, getter);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (getter != <span style="color:#0000ff;">null</span>)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = Wrap(getter(<span style="color:#0000ff;">this</span>.Object));</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">true</span>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">else</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">base</span>.TryGetMember(binder, <span style="color:#0000ff;">out</span> result);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">bool</span> TrySetMember(<span style="color:#2b91af;">SetMemberBinder</span> binder, <span style="color:#0000ff;">object</span> value)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> key = binder.Name;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Action</span>&lt;T, <span style="color:#0000ff;">object</span>&gt; setter = <span style="color:#0000ff;">null</span>;</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (_setters.ContainsKey(key))</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setter = _setters[key];</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">else</span></li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">IEnumerable</span>&lt;<span style="color:#2b91af;">MemberInfo</span>&gt; members = <span style="color:#0000ff;">this</span>.Type.GetMembers(</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">BindingFlags</span>.Instance | <span style="color:#2b91af;">BindingFlags</span>.Public | <span style="color:#2b91af;">BindingFlags</span>.NonPublic | <span style="color:#2b91af;">BindingFlags</span>.SetProperty | <span style="color:#2b91af;">BindingFlags</span>.SetField);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;members = <span style="color:#0000ff;">from</span> mem <span style="color:#0000ff;">in</span> members</li>
<li>&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:#0000ff;">where</span> mem.Name == key</li>
<li style="background:#f3f3f3;">&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:#0000ff;">select</span> mem;</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> member = members.FirstOrDefault();</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (member != <span style="color:#0000ff;">null</span>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setter = BuildSetter(member);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_setters.Add(key, setter);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (setter != <span style="color:#0000ff;">null</span>)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setter(<span style="color:#0000ff;">this</span>.Object, value);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">true</span>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">else</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">base</span>.TrySetMember(binder, value);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">bool</span> TryInvokeMember(<span style="color:#2b91af;">InvokeMemberBinder</span> binder, <span style="color:#0000ff;">object</span>[] args, <span style="color:#0000ff;">out</span> <span style="color:#0000ff;">object</span> result)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>[], <span style="color:#0000ff;">object</span>&gt; func = <span style="color:#0000ff;">null</span>;</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> key = MakeKey(binder, args);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (_methods.ContainsKey(key))</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func = _methods[key];</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">else</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> argTypes = args.Select(arg =&gt; arg <span style="color:#0000ff;">is</span> <span style="color:#2b91af;">IObjectWithType</span> ? (arg <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">IObjectWithType</span>).Type : arg.GetType()).ToArray();</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">IEnumerable</span>&lt;<span style="color:#2b91af;">MethodInfo</span>&gt; methods = <span style="color:#0000ff;">this</span>.Type.GetMethods(<span style="color:#2b91af;">BindingFlags</span>.Public | <span style="color:#2b91af;">BindingFlags</span>.NonPublic | <span style="color:#2b91af;">BindingFlags</span>.Instance);</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methods = <span style="color:#0000ff;">from</span> method <span style="color:#0000ff;">in</span> methods</li>
<li style="background:#f3f3f3;">&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:#0000ff;">where</span> method.Name == binder.Name &amp;&amp; ArgsMatch(method, argTypes)</li>
<li>&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:#0000ff;">select</span> method;</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> info = methods.FirstOrDefault();</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (info != <span style="color:#0000ff;">null</span>)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> paramTypes = info.GetParameters().Select(p =&gt; p.ParameterType).ToArray();</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> target = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:#0000ff;">this</span>.Type, <span style="color:#a31515;">&#8220;obj&#8221;</span>);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:#0000ff;">typeof</span>(<span style="color:#0000ff;">object</span>[]), <span style="color:#a31515;">&#8220;args&#8221;</span>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> call = <span style="color:#2b91af;">Expression</span>.Call(target, info,</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paramTypes.Select((p, i) =&gt;</li>
<li>&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;BuildConvertExpression(<span style="color:#2b91af;">Expression</span>.ArrayAccess(param, <span style="color:#2b91af;">Expression</span>.Constant(i)), p)));</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>[], <span style="color:#0000ff;">object</span>&gt;&gt;(</li>
<li style="background:#f3f3f3;">&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:#2b91af;">Expression</span>.Convert(call, <span style="color:#0000ff;">typeof</span>(<span style="color:#0000ff;">object</span>)), target, param).Compile();</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_methods.Add(key, func);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (func != <span style="color:#0000ff;">null</span>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> res = func(<span style="color:#0000ff;">this</span>.Object, args);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = Wrap(res);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">true</span>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">else</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">base</span>.TryInvokeMember(binder, args, <span style="color:#0000ff;">out</span> result);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">bool</span> TryConvert(<span style="color:#2b91af;">ConvertBinder</span> binder, <span style="color:#0000ff;">out</span> <span style="color:#0000ff;">object</span> result)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (binder.Type.IsAssignableFrom(<span style="color:#0000ff;">this</span>.Type))</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = <span style="color:#0000ff;">this</span>.Object;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">true</span>;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">else</span></li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">base</span>.TryConvert(binder, <span style="color:#0000ff;">out</span> result);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#region</span> Builders</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#region</span> Getter</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>&gt; BuildGetter(<span style="color:#2b91af;">MemberInfo</span> member)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">switch</span> (member.MemberType)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">case</span> <span style="color:#2b91af;">MemberTypes</span>.Field:</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> BuildFieldGetter(member <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">FieldInfo</span>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">case</span> <span style="color:#2b91af;">MemberTypes</span>.Property:</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> BuildPropertyGetter(member <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">PropertyInfo</span>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">default</span>:</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008000;">//Returning null effectively marks this as not supported, since the getter will be null as binding exception will be thrown</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">null</span>;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>&gt; BuildFieldGetter(<span style="color:#2b91af;">FieldInfo</span> fieldInfo)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:#0000ff;">this</span>.Type, <span style="color:#a31515;">&#8220;obj&#8221;</span>);</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> lambda = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>&gt;&gt;(</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Expression</span>.Field(param, fieldInfo),</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param);</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> lambda.Compile();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>&gt; BuildPropertyGetter(<span style="color:#2b91af;">PropertyInfo</span> propertyInfo)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:#0000ff;">this</span>.Type, <span style="color:#a31515;">&#8220;obj&#8221;</span>);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> lambda = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:#0000ff;">object</span>&gt;&gt;(</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Expression</span>.Property(param, propertyInfo),</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> lambda.Compile();</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#endregion</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#region</span> Setter</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#2b91af;">Action</span>&lt;T, <span style="color:#0000ff;">object</span>&gt; BuildSetter(<span style="color:#2b91af;">MemberInfo</span> member)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">switch</span> (member.MemberType)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">case</span> <span style="color:#2b91af;">MemberTypes</span>.Field:</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> BuildFieldSetter(member <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">FieldInfo</span>);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">case</span> <span style="color:#2b91af;">MemberTypes</span>.Property:</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> BuildPropertySetter(member <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">PropertyInfo</span>);</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">default</span>:</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008000;">//Returning null effectively marks this as not supported, since the setter will be null as binding exception will be thrown</span></li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">null</span>;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#2b91af;">Action</span>&lt;T, <span style="color:#0000ff;">object</span>&gt; BuildFieldSetter(<span style="color:#2b91af;">FieldInfo</span> fieldInfo)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:#0000ff;">this</span>.Type, <span style="color:#a31515;">&#8220;obj&#8221;</span>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> value = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:#0000ff;">typeof</span>(<span style="color:#0000ff;">object</span>), <span style="color:#a31515;">&#8220;val&#8221;</span>);</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> lambda = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Action</span>&lt;T, <span style="color:#0000ff;">object</span>&gt;&gt;(</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Expression</span>.Assign(</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Expression</span>.Field(param, fieldInfo),</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Expression</span>.Convert(value, fieldInfo.FieldType)),</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param, value);</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> lambda.Compile();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#2b91af;">Action</span>&lt;T, <span style="color:#0000ff;">object</span>&gt; BuildPropertySetter(<span style="color:#2b91af;">PropertyInfo</span> propertyInfo)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:#0000ff;">this</span>.Type, <span style="color:#a31515;">&#8220;obj&#8221;</span>);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> value = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:#0000ff;">typeof</span>(<span style="color:#0000ff;">object</span>), <span style="color:#a31515;">&#8220;val&#8221;</span>);</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> lambda = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Action</span>&lt;T, <span style="color:#0000ff;">object</span>&gt;&gt;(</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Expression</span>.Assign(</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Expression</span>.Property(param, propertyInfo),</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#2b91af;">Expression</span>.Convert(value, propertyInfo.PropertyType)),</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param, value);</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> lambda.Compile();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#endregion</span></li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#region</span> Convert</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#2b91af;">Expression</span> BuildConvertExpression(<span style="color:#2b91af;">Expression</span> target, <span style="color:#2b91af;">Type</span> type)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (type == <span style="color:#0000ff;">typeof</span>(<span style="color:#0000ff;">object</span>))</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> target;</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#2b91af;">Expression</span>.Call(_doConvert.MakeGenericMethod(type), target);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">static</span> R DoConvert&lt;R&gt;(<span style="color:#0000ff;">object</span> i)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (i <span style="color:#0000ff;">is</span> <span style="color:#2b91af;">IConvertTo</span>&lt;R&gt;)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> (i <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">IConvertTo</span>&lt;R&gt;).Convert();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">else</span></li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> (R)i;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#endregion</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#endregion</span></li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#region</span> Helpers</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">object</span> Wrap(<span style="color:#0000ff;">object</span> res)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (res == <span style="color:#0000ff;">null</span>)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">null</span>;</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> type = res.GetType();</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">if</span> (type.IsPrimitive)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> res;</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> expType = <span style="color:#0000ff;">typeof</span>(<span style="color:#2b91af;">Exposer</span>&lt;&gt;).MakeGenericType(type);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#2b91af;">Activator</span>.CreateInstance(expType, res);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">string</span> MakeKey(<span style="color:#2b91af;">InvokeMemberBinder</span> binder, <span style="color:#0000ff;">object</span>[] args)</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">var</span> ret = <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">StringBuilder</span>();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.Append(binder.Name);</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">foreach</span> (<span style="color:#0000ff;">var</span> arg <span style="color:#0000ff;">in</span> args)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.Append(arg.GetType().Name);</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> ret.ToString();</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">bool</span> ArgsMatch(<span style="color:#2b91af;">MethodInfo</span> info, <span style="color:#2b91af;">Type</span>[] argTypes)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> info.GetParameters()</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Select((p, i) =&gt; p.ParameterType.IsAssignableFrom(argTypes[i]))</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.All(b =&gt; b);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#endregion</span></li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#region</span> IConvertTo&lt;T&gt; Members</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> T Convert()</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">this</span>.Object;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">#endregion</span></li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>&nbsp;</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">Extensions</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#2b91af;">Exposer</span>&lt;T&gt; Expose&lt;T&gt;(<span style="color:#0000ff;">this</span> T target)</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> <span style="color:#2b91af;">Exposer</span>&lt;T&gt;(target);</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li style="background:#f3f3f3;">&nbsp;&nbsp;&nbsp;&nbsp;}</li>
<li>}</li>
</ol></div>
</p></div>
</p></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scmccart.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scmccart.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scmccart.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scmccart.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/scmccart.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/scmccart.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/scmccart.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/scmccart.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scmccart.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scmccart.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scmccart.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scmccart.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scmccart.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scmccart.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=21&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://scmccart.wordpress.com/2009/10/08/c-4-0-exposer-an-evil-dynamicobject/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bbe2e647579a4d24ddfe09815b214408?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scmccart</media:title>
		</media:content>
	</item>
		<item>
		<title>C# 4.0: dynamic&#8217;s compiler tricks</title>
		<link>http://scmccart.wordpress.com/2009/05/20/c-4-0-dynamics-compiler-tricks/</link>
		<comments>http://scmccart.wordpress.com/2009/05/20/c-4-0-dynamics-compiler-tricks/#comments</comments>
		<pubDate>Thu, 21 May 2009 01:36:37 +0000</pubDate>
		<dc:creator>scmccart</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[codeproject]]></category>
		<category><![CDATA[DLR]]></category>

		<guid isPermaLink="false">http://scmccart.wordpress.com/2009/05/20/c-4-0-dynamics-compiler-tricks/</guid>
		<description><![CDATA[So, I was curious today, I had some code that used dynamic and was wondering what the heck the compiler was doing on the back end. So, I wrote up a very small test program, and tore into it using Reflector. The version of Reflector I used still only decompiles to C# 3, so it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=10&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So, I was curious today, I had some code that used dynamic and was wondering what the heck the compiler was doing on the back end. So, I wrote up a very small test program, and tore into it using Reflector. The version of Reflector I used still only decompiles to C# 3, so it happily displayed all of the inner workings to me without trying to hide any of it. Here is my test program:</p>
<pre class="code"><span style="color:blue;">static void </span>Main(<span style="color:blue;">string</span>[] args)
{
    <span style="color:blue;">dynamic </span>foo = <span style="color:#a31515;">"bar"</span>;
    <span style="color:blue;">int </span>meep = foo.Length;
}</pre>
<pre class="code"></pre>
<p>Nice and simple, it shouldn’t look too bad… Well, the compiler generates a static container class that it uses to keep track of some things, and it names everything using names that can’t possibly collide with the programmer’s code. So, instead of showing you code that could make your eyes bleed, I took the liberty of renaming everything and inserting new lines to help readability, the result was:</p>
<pre class="code"><span style="color:blue;">static class </span><span style="color:#2b91af;">CallSiteContainer
</span>{
    <span style="color:blue;">public static </span><span style="color:#2b91af;">CallSite</span>&lt;<span style="color:#2b91af;">Func</span>&lt;<span style="color:#2b91af;">CallSite</span>, <span style="color:blue;">object</span>, <span style="color:blue;">int</span>&gt;&gt; convertSite { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
    <span style="color:blue;">public static </span><span style="color:#2b91af;">CallSite</span>&lt;<span style="color:#2b91af;">Func</span>&lt;<span style="color:#2b91af;">CallSite</span>, <span style="color:blue;">object</span>, <span style="color:blue;">object</span>&gt;&gt; getLengthSite { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
}

<span style="color:blue;">private static void </span>Main(<span style="color:blue;">string</span>[] args)
{
    <span style="color:blue;">object </span>foo = <span style="color:#a31515;">"bar"</span>;

    <span style="color:blue;">if </span>(<span style="color:#2b91af;">CallSiteContainer</span>.convertSite == <span style="color:blue;">null</span>)
        <span style="color:#2b91af;">CallSiteContainer</span>.convertSite = <span style="color:#2b91af;">CallSite</span>&lt;<span style="color:#2b91af;">Func</span>&lt;<span style="color:#2b91af;">CallSite</span>, <span style="color:blue;">object</span>, <span style="color:blue;">int</span>&gt;&gt;
            .Create(<span style="color:blue;">new </span><span style="color:#2b91af;">CSharpConvertBinder</span>(<span style="color:blue;">typeof</span>(<span style="color:blue;">int</span>), <span style="color:#2b91af;">CSharpConversionKind</span>.ImplicitConversion, <span style="color:blue;">false</span>));

    <span style="color:blue;">if </span>(<span style="color:#2b91af;">CallSiteContainer</span>.getLengthSite == <span style="color:blue;">null</span>)
        <span style="color:#2b91af;">CallSiteContainer</span>.getLengthSite = <span style="color:#2b91af;">CallSite</span>&lt;<span style="color:#2b91af;">Func</span>&lt;<span style="color:#2b91af;">CallSite</span>, <span style="color:blue;">object</span>, <span style="color:blue;">object</span>&gt;&gt;
            .Create(<span style="color:blue;">new </span><span style="color:#2b91af;">CSharpGetMemberBinder</span>(<span style="color:#a31515;">"Length"</span>, <span style="color:blue;">typeof</span>(<span style="color:#2b91af;">Program</span>),
                <span style="color:blue;">new </span><span style="color:#2b91af;">CSharpArgumentInfo</span>[] {
                    <span style="color:blue;">new </span><span style="color:#2b91af;">CSharpArgumentInfo</span>(<span style="color:#2b91af;">CSharpArgumentInfoFlags</span>.None, <span style="color:blue;">null</span>)
                }));

    <span style="color:blue;">int </span>meep = <span style="color:#2b91af;">CallSiteContainer</span>.convertSite.Target.Invoke(
        <span style="color:#2b91af;">CallSiteContainer</span>.convertSite,
        <span style="color:#2b91af;">CallSiteContainer</span>.getLengthSite.Target.Invoke(
            <span style="color:#2b91af;">CallSiteContainer</span>.getLengthSite, foo));
}</pre>
<pre class="code"></pre>
<p>So, the first thing to notice is that the compiler is generating a static inner container class that holds the call sites for the operation so that it doesn’t have to keep creating them over and over. A call site is a point where we interact with a dynamic object, we have two here, the get on .Length and the conversion of the result of that get to an integer. Also notice that foo is actually just an object when things are all said and done, the compiler just wraps all interactions with it.</p>
<p>The generic parameter on the CallSite class ends up determining the signature of the call site’s Invoke method. Since the CallSiteContainer.convertSite ends up being the equivalent of the folling lambda, it takes Func&lt;CallSite, object, int&gt; to say that it takes a CallSite, and the object to convert as parameters, then returns an integer.</p>
<pre class="code"><span style="color:#2b91af;">Func</span>&lt;<span style="color:blue;">object</span>, <span style="color:blue;">int</span>&gt; convertSite = obj =&gt; (<span style="color:blue;">int</span>)obj;</pre>
<pre class="code"></pre>
<p>It just takes whatever object and tries to convert it to an int. The other call site is a bit trickier, because you cannot express it as a lambda at compile time, but you could generate one at runtime, look <a href="http://scmccart.wordpress.com/2009/05/04/using-expressions-for-fun-and-profit/" target="_blank">here</a> for details on that. What we do know is that the CallSiteContainer.getLengthSite fetches the value of the Length property or field off of whatever object it is handed. It’s not yet clear to me why the CSharpGetMemberBinder takes the Program type and that CSharpArgumentInfo array, but it probably has something to do with how the DLR caches the code it generates. This whole thing is powered by the DLR, which does all the code generation and caching transparently on the back end. So be thankful for IronPython being around to kick all of this stuff off <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>When we want to actually perform our operation, getting the Length of foo, and assigning it to meep, it just Invokes both of the call sites, passing the output of the getLengthSite to the convertSite, then taking the result of that and giving it to meep. <span style="text-decoration:line-through;">I don’t know why each call site is passed itself as the first parameter, but after that comes what would be passed into the lambda equivalent of each call site.</span> When the call site is Invoked, it is passed in so it can be updated to handle new cases that it hasn’t seen before, then all of the arguments that would have been passed into the lambda equivalent follow.</p>
<p>Well, that’s about it, all of this generated code isn’t too complex, it’s just pretty wordy. Looking at this and DynamicObject, it occurs to me that implementing Ruby style Mixins, methodMissing, and send shouldn’t be too hard. If you feel like I left anything out, please point it out in the comments.</p>
<p><strong>EDIT: </strong>Incorporated information that Curt provided in the comments.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scmccart.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scmccart.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scmccart.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scmccart.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/scmccart.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/scmccart.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/scmccart.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/scmccart.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scmccart.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scmccart.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scmccart.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scmccart.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scmccart.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scmccart.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=10&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://scmccart.wordpress.com/2009/05/20/c-4-0-dynamics-compiler-tricks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bbe2e647579a4d24ddfe09815b214408?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scmccart</media:title>
		</media:content>
	</item>
		<item>
		<title>C# 4.0: DXLinq, a DynamicObject example</title>
		<link>http://scmccart.wordpress.com/2009/05/19/c-4-0-dxlinq-a-dynamicobject-example/</link>
		<comments>http://scmccart.wordpress.com/2009/05/19/c-4-0-dxlinq-a-dynamicobject-example/#comments</comments>
		<pubDate>Wed, 20 May 2009 01:59:40 +0000</pubDate>
		<dc:creator>scmccart</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[codeproject]]></category>

		<guid isPermaLink="false">http://scmccart.wordpress.com/2009/05/19/c-4-0-dxlinq-a-dynamicobject-example/</guid>
		<description><![CDATA[System.Xml.Linq is a great library, it lets us very easily manipulate XML, in very close fashion to how we would interact with other data sources. My only issue is that it tends to seem a little redundant,  given this XML: &#60;A&#62; &#60;B X="1"/&#62; &#60;B X="2"/&#62; &#60;/A&#62; We would do the following to get the value [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=8&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span style="color:#999999;">System.Xml.Linq is a great library, it lets us very easily manipulate XML, in very close fashion to how we would interact with other data sources. My only issue is that it tends to seem a little redundant,  given this XML:</span></p>
<pre class="code"><span style="color:blue;">&lt;</span><span style="color:#a31515;">A</span><span style="color:blue;">&gt;
  &lt;</span><span style="color:#a31515;">B </span><span style="color:red;">X</span><span style="color:blue;">=</span>"<span style="color:blue;">1</span>"<span style="color:blue;">/&gt;
  &lt;</span><span style="color:#a31515;">B </span><span style="color:red;">X</span><span style="color:blue;">=</span>"<span style="color:blue;">2</span>"<span style="color:blue;">/&gt;
&lt;/</span><span style="color:#a31515;">A</span><span style="color:blue;">&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><span style="color:#999999;">We would do the following to get the value of both the X attributes:</span></p>
<pre class="code"><span style="color:blue;">var </span>root = <span style="color:#2b91af;">XElement</span>.Load(<span style="color:#a31515;">"Sample.xml"</span>);

<span style="color:blue;">foreach </span>(<span style="color:blue;">var </span>b <span style="color:blue;">in </span>root.Elements(<span style="color:#a31515;">"B"</span>))
    <span style="color:#2b91af;">Console</span>.WriteLine(b.Attribute(<span style="color:#a31515;">"X"</span>).Value);</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>That’s not exactly the cleanest code ever, so what if we could do this instead:</p>
<pre class="code"><span style="color:blue;">var </span>root = <span style="color:#2b91af;">XElement</span>.Load(<span style="color:#a31515;">"Sample.xml"</span>);

<span style="color:blue;">dynamic </span>xml = <span style="color:blue;">new </span><span style="color:#2b91af;">DXElement</span>(root);

<span style="color:blue;">foreach </span>(<span style="color:blue;">var </span>b <span style="color:blue;">in </span>xml.B)
    <span style="color:#2b91af;">Console</span>.WriteLine(b.X);</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Using the combination of C# 4.0’s new dynamic type, and the DynamicObject class, getting this working is actually pretty easy. What we need is a dynamic that will map properties to child elements and attributes. The DynamicObject base class provides an overloadable TryGetMember method that is called whenever the code tries to get a property off of a dynamic. For example, when xml.B is used above, DynamicObject.TryGetMember is called, asking the DynamicObject to return the value of the member. So the DXElement gets to decide what type and value to return, at runtime. Here is my DXElement class, in its entirety:</p>
<pre class="code"><span style="color:blue;">public class </span><span style="color:#2b91af;">DXElement </span>: <span style="color:#2b91af;">DynamicObject
</span>{
    <span style="color:blue;">public </span><span style="color:#2b91af;">XElement </span>BaseElement { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }

    <span style="color:blue;">public </span>DXElement(<span style="color:#2b91af;">XElement </span>baseElement)
    {
        <span style="color:blue;">this</span>.BaseElement = baseElement;
    }

    <span style="color:blue;">public override bool </span>TryGetMember(<span style="color:#2b91af;">GetMemberBinder </span>binder, <span style="color:blue;">out object </span>result)
    {
        <span style="color:green;">//Go ahead and try to fetch all of the elements matching the member name, and wrap them
        </span><span style="color:blue;">var </span>elements = BaseElement.Elements(binder.Name).Select(element =&gt; <span style="color:blue;">new </span><span style="color:#2b91af;">DXElement</span>(element));

        <span style="color:green;">//Get the count now, so we don't have to call it twice
        </span><span style="color:blue;">int </span>count = elements.Count();
        <span style="color:blue;">if </span>(count &gt; 0)
        {
            <span style="color:blue;">if </span>(count &gt; 1)
                result = elements; <span style="color:green;">//We have more than one matching element, so let's return the collection
            </span><span style="color:blue;">else
                </span>result = elements.FirstOrDefault(); <span style="color:green;">//There is only one matching element, so let's just return it

            </span><span style="color:blue;">return true</span>; <span style="color:green;">//return true cuz we matched
        </span>}
        <span style="color:blue;">else
        </span>{
            <span style="color:green;">//Ok, so no elements matched, so lets try attributes
            </span><span style="color:blue;">var </span>attributes = BaseElement.Attributes(binder.Name).Select(attr =&gt; attr.Value);
            count = attributes.Count();

            <span style="color:blue;">if </span>(count &gt; 0)
            {
                <span style="color:blue;">if </span>(count &gt; 1)
                    result = attributes; <span style="color:green;">//more than one attribute matched, lets return the collection
                </span><span style="color:blue;">else
                    </span>result = attributes.FirstOrDefault(); <span style="color:green;">//only one attribute matched, lets just return it

                </span><span style="color:blue;">return true</span>; <span style="color:green;">// return true cuz we matched
            </span>}
        }

        <span style="color:green;">//no matches, let's let the base class handle this
        </span><span style="color:blue;">return base</span>.TryGetMember(binder, <span style="color:blue;">out </span>result);
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Not too bad right? Now, it makes a couple of assumptions about the input XML, which are most likely false, but for examples sake, we’ll just ignore that fact <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . As you can see, there isn’t much code needed, just the TryGetMemeber overload using XLinq against the BaseElement to find what we want to return as the result.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scmccart.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scmccart.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scmccart.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scmccart.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/scmccart.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/scmccart.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/scmccart.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/scmccart.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scmccart.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scmccart.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scmccart.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scmccart.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scmccart.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scmccart.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=8&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://scmccart.wordpress.com/2009/05/19/c-4-0-dxlinq-a-dynamicobject-example/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bbe2e647579a4d24ddfe09815b214408?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scmccart</media:title>
		</media:content>
	</item>
		<item>
		<title>Dynamic Linq Queries</title>
		<link>http://scmccart.wordpress.com/2009/05/05/dynamic-linq-queries/</link>
		<comments>http://scmccart.wordpress.com/2009/05/05/dynamic-linq-queries/#comments</comments>
		<pubDate>Tue, 05 May 2009 22:08:22 +0000</pubDate>
		<dc:creator>scmccart</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[codeproject]]></category>
		<category><![CDATA[Expressions]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false">http://scmccart.wordpress.com/2009/05/05/dynamic-linq-queries/</guid>
		<description><![CDATA[Alright, let’s assume that we are lazy coders, we have building a lot of Linq queries lately, and it’s getting repetitive. We keep having to remember to add a certain where clause to every query, couldn’t we just abstract this somehow? Well sure, we can use Expressions! Let’s first take a look at the System.Linq.Queryable.Where [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=6&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Alright, let’s assume that we are lazy coders, we have building a lot of Linq queries lately, and it’s getting repetitive. We keep having to remember to add a certain where clause to every query, couldn’t we just abstract this somehow? Well sure, we can use Expressions!</p>
<p>Let’s first take a look at the System.Linq.Queryable.Where extension method, here is the method’s signature:</p>
<pre class="code"><span style="color:blue;">public static </span><span style="color:#2b91af;">IQueryable</span>&lt;TSource&gt; Where&lt;TSource&gt;(
    <span style="color:blue;">this </span><span style="color:#2b91af;">IQueryable</span>&lt;TSource&gt; source,
    <span style="color:#2b91af;">Expression</span>&lt;<span style="color:#2b91af;">Func</span>&lt;TSource, <span style="color:blue;">bool</span>&gt;&gt; predicate);</pre>
<pre class="code"></pre>
<p>Notice that it takes a lambda expression, which we can generate dynamically. For examples sake, let’s make a Foo and a Bar class, and two methods that generate a list of each:</p>
<pre class="code"><span style="color:blue;">static </span><span style="color:#2b91af;">IEnumerable</span>&lt;<span style="color:#2b91af;">Foo</span>&gt; MakeFoos()
{
    <span style="color:blue;">for </span>(<span style="color:blue;">int </span>i = 0; i &lt; 10; i++)
        <span style="color:blue;">yield return new </span><span style="color:#2b91af;">Foo </span>{ A = <span style="color:#a31515;">"Foo " </span>+ i, B = i };
}

<span style="color:blue;">static </span><span style="color:#2b91af;">IEnumerable</span>&lt;<span style="color:#2b91af;">Bar</span>&gt; MakeBars()
{
    <span style="color:blue;">for </span>(<span style="color:blue;">int </span>i = 0; i &lt; 10; i++)
        <span style="color:blue;">yield return new </span><span style="color:#2b91af;">Bar </span>{ A = <span style="color:#a31515;">"Bar " </span>+ i, B = i };
}

<span style="color:blue;">class </span><span style="color:#2b91af;">Foo
</span>{
    <span style="color:blue;">public string </span>A { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
    <span style="color:blue;">public int </span>B { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
}

<span style="color:blue;">class </span><span style="color:#2b91af;">Bar
</span>{
    <span style="color:blue;">public string </span>A { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
    <span style="color:blue;">public int </span>B { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
}</pre>
<pre class="code"></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>So what if we want to get all of the items in a collection with a and even B? What we need is an extension method that applies our filter to an IQueryable&lt;&gt; of any type. First off, let’s look at the method signature:</p>
<pre class="code"><span style="color:blue;">public static </span><span style="color:#2b91af;">IQueryable</span>&lt;T&gt; FilterB&lt;T&gt;(<span style="color:blue;">this </span><span style="color:#2b91af;">IQueryable</span>&lt;T&gt; query)</pre>
<pre class="code"></pre>
<p>It’s fairly simple, it is an extension method that takes an IQueryable&lt;T&gt; and returns an IQueryable&lt;T&gt; so that we can keep our fluent interface going. The first thing we have to do in our method is create a parameter and property expression,</p>
<pre class="code"><span style="color:blue;">var </span>param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:blue;">typeof</span>(T), <span style="color:#a31515;">"x"</span>);
<span style="color:blue;">var </span>prop = <span style="color:#2b91af;">Expression</span>.Property(param, <span style="color:#a31515;">"B"</span>);</pre>
<pre class="code"></pre>
<p>Then we need a binary expression that %’s our property by 2,</p>
<pre class="code"><span style="color:blue;">var </span>two = <span style="color:#2b91af;">Expression</span>.Constant(2);
<span style="color:blue;">var </span>mod = <span style="color:#2b91af;">Expression</span>.MakeBinary(<span style="color:#2b91af;">ExpressionType</span>.Modulo, prop, two);</pre>
<pre class="code"></pre>
<p>The ConstantExpressions are pretty self explanatory, they just hold the value that they are given. BinaryExpressions can represent any kind of binary expression, which is any expression that has a left and right side, like a == b, a != b, a + b, and b – a for example. Next, we need to make another binary expression that checks to see if our first binary expression, mod, is equal to zero:</p>
<pre class="code"><span style="color:blue;">var </span>zero = <span style="color:#2b91af;">Expression</span>.Constant(0) ;
<span style="color:blue;">var </span>eqZero = <span style="color:#2b91af;">Expression</span>.MakeBinary(<span style="color:#2b91af;">ExpressionType</span>.Equal, mod, zero);</pre>
<pre class="code"></pre>
<p>Notice that we used one binary expression as a parameter for another, MakeBinary’s second and third parameters are just Expressions which can be any type of expression. All that is left to do is create the lambda expression, where it and return it:</p>
<pre class="code"><span style="color:blue;">var </span>lambda = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:blue;">bool</span>&gt;&gt;(eqZero, param);
<span style="color:blue;">return </span>query.Where(lambda);</pre>
<pre class="code"></pre>
<p>We don’t have to compile the lambda here because query providers use it in its raw expression tree form which they translate into whatever they need to get the job done. Here is the entire method:</p>
<pre class="code"><span style="color:blue;">public static </span><span style="color:#2b91af;">IQueryable</span>&lt;T&gt; FilterB&lt;T&gt;(<span style="color:blue;">this </span><span style="color:#2b91af;">IQueryable</span>&lt;T&gt; query)
{
    <span style="color:blue;">var </span>param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:blue;">typeof</span>(T), <span style="color:#a31515;">"x"</span>);
    <span style="color:blue;">var </span>prop = <span style="color:#2b91af;">Expression</span>.Property(param, <span style="color:#a31515;">"B"</span>);

    <span style="color:blue;">var </span>two = <span style="color:#2b91af;">Expression</span>.Constant(2);
    <span style="color:blue;">var </span>mod = <span style="color:#2b91af;">Expression</span>.MakeBinary(<span style="color:#2b91af;">ExpressionType</span>.Modulo, prop, two);

    <span style="color:blue;">var </span>zero = <span style="color:#2b91af;">Expression</span>.Constant(0);
    <span style="color:blue;">var </span>eqZero = <span style="color:#2b91af;">Expression</span>.MakeBinary(<span style="color:#2b91af;">ExpressionType</span>.Equal, mod, zero);

    <span style="color:blue;">var </span>lambda = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Func</span>&lt;T, <span style="color:blue;">bool</span>&gt;&gt;(eqZero, param);
    <span style="color:blue;">return </span>query.Where(lambda);
}</pre>
<pre class="code"></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>This should work with any query provider including Linq to SQL and the Entity Framework. We haven’t built in any error checking so expect it to throw if you use it on a collection of a type that does not have a B property. So, given the types we defined above, let’s see how we would use it:</p>
<pre class="code"><span style="color:blue;">var </span>foos = MakeFoos().AsQueryable();
<span style="color:blue;">var </span>bars = MakeBars().AsQueryable();

<span style="color:blue;">foreach </span>(<span style="color:blue;">var </span>foo <span style="color:blue;">in </span>foos.FilterB())
    <span style="color:#2b91af;">Console</span>.WriteLine(foo.A);

<span style="color:blue;">foreach </span>(<span style="color:blue;">var </span>bar <span style="color:blue;">in </span>bars.FilterB())
    <span style="color:#2b91af;">Console</span>.WriteLine(bar.A);</pre>
<pre class="code"></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>We are first getting collections of both Foos and Bars, and then changing them into IQueryable collections. we then just iterate over each collection after calling FilterB() on them. We could chain other calls after the FilterB call if we wanted. The output will be:</p>
<p>Foo 0</p>
<p>Foo 2</p>
<p>Foo 4</p>
<p>Foo 6</p>
<p>Foo 8</p>
<p>Bar 0</p>
<p>Bar 2</p>
<p>Bar 4</p>
<p>Bar 6</p>
<p>Bar 8</p>
<p>Yay! It works!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scmccart.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scmccart.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scmccart.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scmccart.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/scmccart.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/scmccart.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/scmccart.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/scmccart.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scmccart.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scmccart.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scmccart.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scmccart.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scmccart.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scmccart.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=6&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://scmccart.wordpress.com/2009/05/05/dynamic-linq-queries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bbe2e647579a4d24ddfe09815b214408?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scmccart</media:title>
		</media:content>
	</item>
		<item>
		<title>Using Expressions for Fun and Profit</title>
		<link>http://scmccart.wordpress.com/2009/05/04/using-expressions-for-fun-and-profit/</link>
		<comments>http://scmccart.wordpress.com/2009/05/04/using-expressions-for-fun-and-profit/#comments</comments>
		<pubDate>Mon, 04 May 2009 22:40:22 +0000</pubDate>
		<dc:creator>scmccart</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[codeproject]]></category>
		<category><![CDATA[Expressions]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false">http://scmccart.wordpress.com/2009/05/04/using-expressions-for-fun-and-profit/</guid>
		<description><![CDATA[Well, by now we all  know how to abuse System.Reflection to the point of absurdity, so now it’s time to start the abuse of System.Expressions. The System.Expressions namespace contains everything you need to build lambda expressions on the fly, then compile them at run time for use. One may ask “Why Bother?”, well my friend, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=4&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Well, by now we all  know how to abuse System.Reflection to the point of absurdity, so now it’s time to start the abuse of System.Expressions. The System.Expressions namespace contains everything you need to build lambda expressions on the fly, then compile them at run time for use. One may ask “Why Bother?”, well my friend, the answer is Speed. If you are using reflection heavily in your projects, you are likely to get a nice speed boost by switching to Expressions. There are is one detail to keep in mind though, that the actual compilation of expressions can take some time, so you will want to cache the result.</p>
<p>First off, let’s take a look at a simple lambda, and then try to build it dynamically. Say we want to grab the length of a string:</p>
<pre class="code"><span style="color:#2b91af;">Func</span>&lt;<span style="color:blue;">string</span>, <span style="color:blue;">int</span>&gt; getStrLen = x =&gt; x.Length;</pre>
<p><a href="http://11011.net/software/vspaste"></a> The lambda expression that we are assigning to the delegate has 2 main parts, the x parameter, and the x.Length property access. Let’s go ahead and create these two smaller expressions. Expressions use a factory pattern and can only be instantiated through static methods of off Expression so here is the code to build those two parts:</p>
<pre class="code"><span style="color:blue;">var </span>param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:blue;">typeof</span>(<span style="color:blue;">string</span>), <span style="color:#a31515;">"x"</span>);
<span style="color:blue;">var </span>prop = <span style="color:#2b91af;">Expression</span>.Property(param, <span style="color:#a31515;">"Length"</span>);</pre>
<p><a href="http://11011.net/software/vspaste"></a> Expression.Parameter take a Type as the first parameter, which is the type of the parameter, and a string as the second parameter which is only used when you .ToString() the expression. Expression.Property takes another Expression as the first parameter, in our case we are using the ParameterExpression we created on the line before, but it can be a few other things like other PropertyExpressions, ConstantExpressions, CallExpressions, etc. The second parameter of Expression.Property is a string, it is just the name of the property you want to get. All that is left to do now is to build the lambda expression itself, and compile it:</p>
<pre class="code"><span style="color:blue;">var </span>lambda = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Func</span>&lt;<span style="color:blue;">string</span>, <span style="color:blue;">int</span>&gt;&gt;(prop, param);
<span style="color:#2b91af;">Func</span>&lt;<span style="color:blue;">string</span>, <span style="color:blue;">int</span>&gt; result = lambda.Compile();</pre>
<p>Expression.Lambda has both regular and generic versions, we want to use the generic because we want to be able to call it as directly as possible. The first parameter it takes is the body of the lambda, and in our case that is x.Length, which is our prop variable. Every parameter after the first should be ParameterExpressions representing parameters that you are passing to the lambda, and should match the order and number of the generic parameters on the delegate type that is used as the generic for Expression.Lambda. The call to lambda.Compile() is where the real magic happens, the library compiles our expression tree down to executable code. So, we’ve dynamically built the same lambda as we have assigned to getStrLen. if you are looking for more proof, check lambda.ToString(), which also comes in handy when you are trying to debug your expression building code.  Alright, now let’s build a nice generic method using the same pieces as above, starting off with the method signature:</p>
<pre class="code"><span style="color:#2b91af;">Func</span>&lt;T,R&gt; BuildGetProperty&lt;T, R&gt;(<span style="color:blue;">string </span>propName)</pre>
<p>Our method will have two generic parameters, T which is the type containing the property, and R which is the type of the property, and one string that will be the name of the property to get. The body of our method is going to be almost verbatim of what is outlined above, except that we are going to substitute our generic types and property name. The end result is:</p>
<pre class="code"><span style="color:blue;">public static </span><span style="color:#2b91af;">Func</span>&lt;T,R&gt; BuildGetProperty&lt;T, R&gt;(<span style="color:blue;">string </span>propName)
{
    <span style="color:blue;">var </span>param = <span style="color:#2b91af;">Expression</span>.Parameter(<span style="color:blue;">typeof</span>(T), <span style="color:#a31515;">"x"</span>);
    <span style="color:blue;">var </span>prop = <span style="color:#2b91af;">Expression</span>.Property(param, propName);

    <span style="color:blue;">var </span>lambda = <span style="color:#2b91af;">Expression</span>.Lambda&lt;<span style="color:#2b91af;">Func</span>&lt;T, R&gt;&gt;(prop, param);
    <span style="color:blue;">return </span>lambda.Compile();
}</pre>
<p><a href="http://11011.net/software/vspaste"></a> So, we could replace our getStrLen lambda above with:</p>
<pre class="code"><span style="color:blue;">var </span>getStrLen = BuildGetProperty&lt;<span style="color:blue;">string</span>, <span style="color:blue;">int</span>&gt;(<span style="color:#a31515;">"Length"</span>);</pre>
<p>And to use it:</p>
<pre class="code"><span style="color:blue;">var </span>len = getStrLen(<span style="color:#a31515;">"woot"</span>);</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Which would yield 4 as the result. I’ll be covering more on Expressions in further posts, so stay tuned. Also, comments are more than welcome since this is my first post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/scmccart.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/scmccart.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/scmccart.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/scmccart.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/scmccart.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/scmccart.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/scmccart.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/scmccart.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/scmccart.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/scmccart.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/scmccart.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/scmccart.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/scmccart.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/scmccart.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=scmccart.wordpress.com&amp;blog=7226197&amp;post=4&amp;subd=scmccart&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://scmccart.wordpress.com/2009/05/04/using-expressions-for-fun-and-profit/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/bbe2e647579a4d24ddfe09815b214408?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">scmccart</media:title>
		</media:content>
	</item>
	</channel>
</rss>
