<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Mikael Söderström : C# 4.0</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx</link><description>Tags: C# 4.0</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Skapa objekt med data dynamiskt med ExpandoObject</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/skapa-objekt-med-data-dynamiskt-med-expandoobject.aspx</link><pubDate>Tue, 06 Oct 2009 11:54:50 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7223988</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7223988</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7223988</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/skapa-objekt-med-data-dynamiskt-med-expandoobject.aspx#comments</comments><description>&lt;p&gt;När man arbetar med dynamic i .NET 4.0 så tar man ett befintligt objekt och säger att man vill använda vissa metoder eller egenskaper som finns för det objektet. Det laddas anropas sedan under runtime. Om objektet inte har de metoder som finns så får man under runtime ett fel om det, trots att allt kompilerade utan problem. &lt;p&gt;Så hur gör vi nu om vi vill skapa ett dynamiskt objekt och berätta för det vilka egenskaper och värden som finns samt till dela dem värden för att sedan anropa dem? &lt;p&gt;I .NET 4.0 under System.Dynamic så finns det ett objekt för detta, kallat ExpandoObject. Det är ett helt tomt objekt utan några egenskaper eller metoder som helst förutom de vanliga Equals(), GetHashCode(), GetType() och ToString(). Det implementerar dock ett antal interfaces, vilka används internt för att hålla reda på de metoder vi lägger på det dynamiska objektet: IDynamicMetaObjectProvider, IDictionary&amp;lt;string, Object&amp;gt;, ICollection&amp;lt;KeyValuePair&amp;lt;string, Object&amp;gt;&amp;gt;, IEnumerable&amp;lt;KeyValuePair&amp;lt;string, Object&amp;gt;&amp;gt; och IEnumerable. &lt;p&gt;När vi använder ExpandoObject så kan vi skapa instansen som vanligt: &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;ExpandoObject o = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpandoObject(); &lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Det här gör dock att vi star där med en instans av ett object som inte kan göra något förutom att visa att det är ett ExpandoObject, ingen höjdare alltså.
&lt;p&gt;Vi kan däremot skapa en dynamisk instans av detta objekt, och då lägga på några metoder.
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;dynamic magic = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpandoObject();&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;magic.IntX = 10;&lt;/pre&gt;&lt;pre&gt;magic.IntY = 20;&lt;/pre&gt;&lt;pre class="alt"&gt;magic.Name = &lt;span class="str"&gt;"Nisse"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;magic.SayHello = &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(x =&amp;gt; Console.WriteLine(&lt;span class="str"&gt;"Hello, "&lt;/span&gt; + x + &lt;span class="str"&gt;"!"&lt;/span&gt;));&lt;/pre&gt;&lt;pre class="alt"&gt;magic.Multiply = &lt;span class="kwrd"&gt;new&lt;/span&gt; Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;((x, y) =&amp;gt; x * y);&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Här har vi skapat en dynamisk instans av ett ExpandoObject, och säger att vi har ett antal metoder och egenskaper som ska finnas på det objektet.
&lt;p&gt;Om det här hade varit en instans av ett vanligt objekt så hade vi fått ett runtime-fel som sager att metoderna inte finns för objektet. Det naturliga vore om detsamma gäller för detta objekt, så vi lägger till de här raderna under:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;Console.WriteLine(&lt;span class="str"&gt;"X: {0}"&lt;/span&gt;, magic.IntX);&lt;/pre&gt;&lt;pre&gt;Console.WriteLine(&lt;span class="str"&gt;"Y: {0}"&lt;/span&gt;, magic.IntY);&lt;/pre&gt;&lt;pre class="alt"&gt;Console.WriteLine(&lt;span class="str"&gt;"Name: {0}"&lt;/span&gt;, magic.Name);&lt;/pre&gt;&lt;pre&gt;Console.WriteLine(&lt;span class="str"&gt;"Multiply(X, Y): {0}"&lt;/span&gt;, magic.Multiply(magic.IntX, magic.IntY));&lt;/pre&gt;&lt;pre class="alt"&gt;magic.SayHello(magic.Name);&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;När vi nu startar igång programmet så ser vi att vi inte alls fick något fel, utan istället det här:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Console_1606DD96.png"&gt;&lt;img title="1 - Console" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="63" alt="1 - Console" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Console_thumb_37F4D0CB.png" width="157" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;Vi har alltså skapat upp ett dynamiskt objekt och tilldelat det metoder och egenskaper, på precis samma sätt som vi hade gjort med ett dynamiskt språk som JavaScript eller IronRuby, trots att det är ett statiskt språk vi arbetar med!
&lt;p&gt;Så hur går det till? Som jag nämnde tidigare så implementerar ExpandoObject ett antal interfaces som används för collections. När vi tilldelar vårt objekt egenskaper med dess värden så lagras dessa i collections internt i objektet, och plockas sedan fram när vi anropar dem.
&lt;p&gt;Om vi debuggar så ser vi att vi får upp detta:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/2DebugDynamicView_27102CDB.png"&gt;&lt;img title="2 - Debug Dynamic View" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="150" alt="2 - Debug Dynamic View" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/2DebugDynamicView_thumb_7F029F1D.png" width="644" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;I Visual Studio 2010 så finns det en ny visualizer som används för att visa vad som finns i dynamiska vyer som denna. Vi kan här se att det har skapats olika metoder för vårt objekt med antingen datan vi har skickat in, eller de delegater som används (Action&amp;lt;string&amp;gt; och Func&amp;lt;int, int, int&amp;gt;).
&lt;p&gt;Om vi går ännu djupare så kan vi se att det i vårt objekt finns en Dictionary&amp;lt;string, object&amp;gt; som håller reda på våra objekt:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/3Dictionary_55B30932.png"&gt;&lt;img title="3 - Dictionary" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="120" alt="3 - Dictionary" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/3Dictionary_thumb_38D19670.png" width="644" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;Vi kan enkelt se alla nycklar:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/4Keys_2066A475.png"&gt;&lt;img title="4 - Keys" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="125" alt="4 - Keys" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/4Keys_thumb_6FD326BC.png" width="225" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;Och värden:
&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/5Values_583B7949.png"&gt;&lt;img title="5 - Values" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="121" alt="5 - Values" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/5Values_thumb_55954E49.png" width="384" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;Om vi analyserar IL-koden så kan vi se att Action&amp;lt;&amp;gt; och Func&amp;lt;&amp;gt; har skrivits om till vanliga void.
&lt;p&gt;SayHello:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;.method &lt;span class="kwrd"&gt;private&lt;/span&gt; hidebysig &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; &amp;lt;Main&amp;gt;b__12(&lt;span class="kwrd"&gt;string&lt;/span&gt; x) cil managed&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    .custom instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()&lt;/pre&gt;&lt;pre&gt;    .maxstack 8&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0000: ldstr &lt;span class="str"&gt;"Hello, "&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0005: ldarg.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0006: ldstr &lt;span class="str"&gt;"!"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_000b: call &lt;span class="kwrd"&gt;string&lt;/span&gt; [mscorlib]System.String::Concat(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0010: call &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Console::WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0015: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0016: ret &lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;.field &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate14&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    .custom instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Multiply:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;.method &lt;span class="kwrd"&gt;private&lt;/span&gt; hidebysig &lt;span class="kwrd"&gt;static&lt;/span&gt; int32 &amp;lt;Main&amp;gt;b__13(int32 x, int32 y) cil managed&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    .custom instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()&lt;/pre&gt;&lt;pre&gt;    .maxstack 2&lt;/pre&gt;&lt;pre class="alt"&gt;    .locals init (&lt;/pre&gt;&lt;pre&gt;        [0] int32 CS$1$0000)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0000: ldarg.0 &lt;/pre&gt;&lt;pre&gt;    L_0001: ldarg.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0002: mul &lt;/pre&gt;&lt;pre&gt;    L_0003: stloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0004: br.s L_0006&lt;/pre&gt;&lt;pre&gt;    L_0006: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0007: ret &lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;.field &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt; CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate15&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    .custom instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Det är inga konstigheter här, utan vid kompilering så sker detta alltid automatiskt.
&lt;p&gt;Därememot så är Main-metoden mer intressant.
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;.method &lt;span class="kwrd"&gt;private&lt;/span&gt; hidebysig &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args) cil managed&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    .entrypoint&lt;/pre&gt;&lt;pre&gt;    .maxstack 15&lt;/pre&gt;&lt;pre class="alt"&gt;    .locals init (&lt;/pre&gt;&lt;pre&gt;        [0] &lt;span class="kwrd"&gt;object&lt;/span&gt; magic,&lt;/pre&gt;&lt;pre class="alt"&gt;        [1] &lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo[] CS$0$0000)&lt;/pre&gt;&lt;pre&gt;    L_0000: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0001: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [System.Core]System.Dynamic.ExpandoObject::.ctor()&lt;/pre&gt;&lt;pre&gt;    L_0006: stloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0007: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site1&lt;/pre&gt;&lt;pre&gt;    L_000c: brtrue.s L_004a&lt;/pre&gt;&lt;pre class="alt"&gt;    L_000e: ldstr &lt;span class="str"&gt;"IntX"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0013: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0018: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_001d: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_001e: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0023: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0024: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0025: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0026: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0027: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0028: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_002d: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_002e: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_002f: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0030: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_0031: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0032: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0037: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0038: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0039: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_003e: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_0043: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site1&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0048: br.s L_004a&lt;/pre&gt;&lt;pre&gt;    L_004a: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site1&lt;/pre&gt;&lt;pre class="alt"&gt;    L_004f: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0054: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site1&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0059: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_005a: ldc.i4.s 10&lt;/pre&gt;&lt;pre class="alt"&gt;    L_005c: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_0061: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0062: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site2&lt;/pre&gt;&lt;pre&gt;    L_0067: brtrue.s L_00a5&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0069: ldstr &lt;span class="str"&gt;"IntY"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_006e: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0073: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0078: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0079: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_007e: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_007f: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0080: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0081: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0082: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0083: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0088: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0089: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_008a: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_008b: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_008c: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_008d: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0092: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0093: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0094: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0099: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_009e: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site2&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00a3: br.s L_00a5&lt;/pre&gt;&lt;pre&gt;    L_00a5: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site2&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00aa: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_00af: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site2&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00b4: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_00b5: ldc.i4.s 20&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00b7: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, int32, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_00bc: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00bd: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site3&lt;/pre&gt;&lt;pre&gt;    L_00c2: brtrue.s L_0100&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00c4: ldstr &lt;span class="str"&gt;"Name"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_00c9: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00ce: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_00d3: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00d4: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_00d9: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00da: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_00db: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00dc: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_00dd: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00de: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_00e3: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00e4: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_00e5: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00e6: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_00e7: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00e8: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_00ed: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_00ee: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_00ef: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00f4: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_00f9: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site3&lt;/pre&gt;&lt;pre class="alt"&gt;    L_00fe: br.s L_0100&lt;/pre&gt;&lt;pre&gt;    L_0100: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site3&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0105: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_010a: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site3&lt;/pre&gt;&lt;pre class="alt"&gt;    L_010f: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0110: ldstr &lt;span class="str"&gt;"Nisse"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0115: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_011a: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_011b: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site4&lt;/pre&gt;&lt;pre&gt;    L_0120: brtrue.s L_015e&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0122: ldstr &lt;span class="str"&gt;"SayHello"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0127: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_012c: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0131: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0132: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0137: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0138: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0139: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_013a: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_013b: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_013c: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0141: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0142: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0143: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0144: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_0145: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0146: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_014b: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_014c: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_014d: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0152: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_0157: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site4&lt;/pre&gt;&lt;pre class="alt"&gt;    L_015c: br.s L_015e&lt;/pre&gt;&lt;pre&gt;    L_015e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site4&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0163: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0168: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site4&lt;/pre&gt;&lt;pre class="alt"&gt;    L_016d: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_016e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate14&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0173: brtrue.s L_0188&lt;/pre&gt;&lt;pre&gt;    L_0175: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0176: ldftn &lt;span class="kwrd"&gt;void&lt;/span&gt; ExpandoObjectTesting.Program::&amp;lt;Main&amp;gt;b__12(&lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_017c: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;::.ctor(&lt;span class="kwrd"&gt;object&lt;/span&gt;, native &lt;span class="kwrd"&gt;int&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0181: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate14&lt;/pre&gt;&lt;pre&gt;    L_0186: br.s L_0188&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0188: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate14&lt;/pre&gt;&lt;pre&gt;    L_018d: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`1&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0192: pop &lt;/pre&gt;&lt;pre&gt;    L_0193: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site5&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0198: brtrue.s L_01d6&lt;/pre&gt;&lt;pre&gt;    L_019a: ldstr &lt;span class="str"&gt;"Multiply"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_019f: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_01a4: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01a9: ldc.i4.2 &lt;/pre&gt;&lt;pre&gt;    L_01aa: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01af: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_01b0: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01b1: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_01b2: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01b3: ldnull &lt;/pre&gt;&lt;pre&gt;    L_01b4: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01b9: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_01ba: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01bb: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_01bc: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01bd: ldnull &lt;/pre&gt;&lt;pre&gt;    L_01be: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01c3: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_01c4: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01c5: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_01ca: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01cf: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site5&lt;/pre&gt;&lt;pre&gt;    L_01d4: br.s L_01d6&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01d6: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site5&lt;/pre&gt;&lt;pre&gt;    L_01db: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01e0: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site5&lt;/pre&gt;&lt;pre&gt;    L_01e5: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_01e6: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate15&lt;/pre&gt;&lt;pre&gt;    L_01eb: brtrue.s L_0200&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01ed: ldnull &lt;/pre&gt;&lt;pre&gt;    L_01ee: ldftn int32 ExpandoObjectTesting.Program::&amp;lt;Main&amp;gt;b__13(int32, int32)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01f4: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;::.ctor(&lt;span class="kwrd"&gt;object&lt;/span&gt;, native &lt;span class="kwrd"&gt;int&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_01f9: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate15&lt;/pre&gt;&lt;pre class="alt"&gt;    L_01fe: br.s L_0200&lt;/pre&gt;&lt;pre&gt;    L_0200: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt; ExpandoObjectTesting.Program::CS$&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate15&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0205: callvirt instance !3 [mscorlib]System.Func`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;int32, int32, int32&amp;gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_020a: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_020b: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site6&lt;/pre&gt;&lt;pre&gt;    L_0210: brtrue.s L_025b&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0212: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0213: ldstr &lt;span class="str"&gt;"WriteLine"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0218: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_021d: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0222: ldnull &lt;/pre&gt;&lt;pre&gt;    L_0223: ldc.i4.3 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0224: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0229: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_022a: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_022b: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_022c: ldc.i4.s 0x21&lt;/pre&gt;&lt;pre&gt;    L_022e: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_022f: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0234: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0235: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0236: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0237: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_0238: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0239: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_023e: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_023f: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0240: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0241: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0242: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0243: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0248: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0249: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_024a: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_024f: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_0254: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site6&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0259: br.s L_025b&lt;/pre&gt;&lt;pre&gt;    L_025b: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site6&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0260: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0265: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site6&lt;/pre&gt;&lt;pre class="alt"&gt;    L_026a: ldtoken [mscorlib]System.Console&lt;/pre&gt;&lt;pre&gt;    L_026f: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0274: ldstr &lt;span class="str"&gt;"X: {0}"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0279: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site7&lt;/pre&gt;&lt;pre class="alt"&gt;    L_027e: brtrue.s L_02b2&lt;/pre&gt;&lt;pre&gt;    L_0280: ldstr &lt;span class="str"&gt;"IntX"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0285: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_028a: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_028f: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_0290: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0295: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0296: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0297: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0298: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0299: ldnull &lt;/pre&gt;&lt;pre&gt;    L_029a: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_029f: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_02a0: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02a1: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_02a6: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02ab: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site7&lt;/pre&gt;&lt;pre&gt;    L_02b0: br.s L_02b2&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02b2: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site7&lt;/pre&gt;&lt;pre&gt;    L_02b7: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02bc: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site7&lt;/pre&gt;&lt;pre&gt;    L_02c1: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02c2: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre&gt;    L_02c7: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02cc: nop &lt;/pre&gt;&lt;pre&gt;    L_02cd: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site8&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02d2: brtrue.s L_031d&lt;/pre&gt;&lt;pre&gt;    L_02d4: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02d5: ldstr &lt;span class="str"&gt;"WriteLine"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_02da: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02df: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_02e4: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02e5: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_02e6: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02eb: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_02ec: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02ed: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_02ee: ldc.i4.s 0x21&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02f0: ldnull &lt;/pre&gt;&lt;pre&gt;    L_02f1: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_02f6: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_02f7: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02f8: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_02f9: ldc.i4.3 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_02fa: ldnull &lt;/pre&gt;&lt;pre&gt;    L_02fb: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0300: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_0301: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0302: ldc.i4.2 &lt;/pre&gt;&lt;pre&gt;    L_0303: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0304: ldnull &lt;/pre&gt;&lt;pre&gt;    L_0305: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_030a: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_030b: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_030c: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_0311: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0316: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site8&lt;/pre&gt;&lt;pre&gt;    L_031b: br.s L_031d&lt;/pre&gt;&lt;pre class="alt"&gt;    L_031d: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site8&lt;/pre&gt;&lt;pre&gt;    L_0322: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0327: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site8&lt;/pre&gt;&lt;pre&gt;    L_032c: ldtoken [mscorlib]System.Console&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0331: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0336: ldstr &lt;span class="str"&gt;"Y: {0}"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_033b: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site9&lt;/pre&gt;&lt;pre&gt;    L_0340: brtrue.s L_0374&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0342: ldstr &lt;span class="str"&gt;"IntY"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0347: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_034c: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0351: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0352: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0357: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0358: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0359: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_035a: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_035b: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_035c: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0361: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0362: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0363: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0368: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_036d: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site9&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0372: br.s L_0374&lt;/pre&gt;&lt;pre&gt;    L_0374: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site9&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0379: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_037e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site9&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0383: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0384: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0389: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre&gt;    L_038e: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_038f: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitea&lt;/pre&gt;&lt;pre&gt;    L_0394: brtrue.s L_03df&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0396: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0397: ldstr &lt;span class="str"&gt;"WriteLine"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_039c: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_03a1: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03a6: ldnull &lt;/pre&gt;&lt;pre&gt;    L_03a7: ldc.i4.3 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03a8: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_03ad: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03ae: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_03af: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03b0: ldc.i4.s 0x21&lt;/pre&gt;&lt;pre&gt;    L_03b2: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03b3: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_03b8: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03b9: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_03ba: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03bb: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_03bc: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03bd: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_03c2: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03c3: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_03c4: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03c5: ldc.i4.0 &lt;/pre&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;L_03c6: ldnull &lt;/pre&gt;&lt;pre&gt;    L_03c7: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03cc: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_03cd: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_03ce: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_03d3: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03d8: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitea&lt;/pre&gt;&lt;pre&gt;    L_03dd: br.s L_03df&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03df: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitea&lt;/pre&gt;&lt;pre&gt;    L_03e4: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03e9: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitea&lt;/pre&gt;&lt;pre&gt;    L_03ee: ldtoken [mscorlib]System.Console&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03f3: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_03f8: ldstr &lt;span class="str"&gt;"Name: {0}"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_03fd: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Siteb&lt;/pre&gt;&lt;pre&gt;    L_0402: brtrue.s L_0436&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0404: ldstr &lt;span class="str"&gt;"Name"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0409: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_040e: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0413: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0414: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0419: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_041a: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_041b: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_041c: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_041d: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_041e: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0423: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0424: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0425: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_042a: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_042f: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Siteb&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0434: br.s L_0436&lt;/pre&gt;&lt;pre&gt;    L_0436: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Siteb&lt;/pre&gt;&lt;pre class="alt"&gt;    L_043b: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0440: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Siteb&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0445: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0446: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_044b: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre&gt;    L_0450: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0451: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitec&lt;/pre&gt;&lt;pre&gt;    L_0456: brtrue.s L_04a1&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0458: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0459: ldstr &lt;span class="str"&gt;"WriteLine"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    L_045e: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre&gt;    L_0463: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0468: ldnull &lt;/pre&gt;&lt;pre&gt;    L_0469: ldc.i4.3 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_046a: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_046f: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0470: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0471: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0472: ldc.i4.s 0x21&lt;/pre&gt;&lt;pre&gt;    L_0474: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0475: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_047a: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_047b: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_047c: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_047d: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_047e: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_047f: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0484: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0485: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0486: ldc.i4.2 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0487: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_0488: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0489: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_048e: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_048f: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0490: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0495: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_049a: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitec&lt;/pre&gt;&lt;pre class="alt"&gt;    L_049f: br.s L_04a1&lt;/pre&gt;&lt;pre&gt;    L_04a1: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitec&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04a6: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_04ab: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitec&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04b0: ldtoken [mscorlib]System.Console&lt;/pre&gt;&lt;pre&gt;    L_04b5: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04ba: ldstr &lt;span class="str"&gt;"Multiply(X, Y): {0}"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_04bf: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sited&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04c4: brtrue.s L_050e&lt;/pre&gt;&lt;pre&gt;    L_04c6: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04c7: ldstr &lt;span class="str"&gt;"Multiply"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_04cc: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04d1: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_04d6: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04d7: ldc.i4.3 &lt;/pre&gt;&lt;pre&gt;    L_04d8: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04dd: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_04de: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04df: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_04e0: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04e1: ldnull &lt;/pre&gt;&lt;pre&gt;    L_04e2: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04e7: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_04e8: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04e9: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_04ea: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04eb: ldnull &lt;/pre&gt;&lt;pre&gt;    L_04ec: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04f1: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_04f2: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04f3: ldc.i4.2 &lt;/pre&gt;&lt;pre&gt;    L_04f4: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04f5: ldnull &lt;/pre&gt;&lt;pre&gt;    L_04f6: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_04fb: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_04fc: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_04fd: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_0502: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0507: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sited&lt;/pre&gt;&lt;pre&gt;    L_050c: br.s L_050e&lt;/pre&gt;&lt;pre class="alt"&gt;    L_050e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sited&lt;/pre&gt;&lt;pre&gt;    L_0513: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0518: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sited&lt;/pre&gt;&lt;pre&gt;    L_051d: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_051e: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitee&lt;/pre&gt;&lt;pre&gt;    L_0523: brtrue.s L_0557&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0525: ldstr &lt;span class="str"&gt;"IntX"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_052a: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_052f: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0534: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0535: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_053a: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_053b: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_053c: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_053d: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_053e: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_053f: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0544: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0545: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0546: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_054b: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_0550: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitee&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0555: br.s L_0557&lt;/pre&gt;&lt;pre&gt;    L_0557: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitee&lt;/pre&gt;&lt;pre class="alt"&gt;    L_055c: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_0561: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitee&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0566: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0567: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_056c: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitef&lt;/pre&gt;&lt;pre&gt;    L_0571: brtrue.s L_05a5&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0573: ldstr &lt;span class="str"&gt;"IntY"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0578: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_057d: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0582: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0583: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0588: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0589: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_058a: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_058b: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_058c: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_058d: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0592: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0593: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0594: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0599: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_059e: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitef&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05a3: br.s L_05a5&lt;/pre&gt;&lt;pre&gt;    L_05a5: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitef&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05aa: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_05af: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Sitef&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05b4: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_05b5: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05ba: callvirt instance !4 [mscorlib]System.Func`5&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre&gt;    L_05bf: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`4&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2, !3)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05c4: nop &lt;/pre&gt;&lt;pre&gt;    L_05c5: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site10&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05ca: brtrue.s L_060a&lt;/pre&gt;&lt;pre&gt;    L_05cc: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05cd: ldstr &lt;span class="str"&gt;"SayHello"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_05d2: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05d7: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_05dc: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05dd: ldc.i4.2 &lt;/pre&gt;&lt;pre&gt;    L_05de: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05e3: stloc.1 &lt;/pre&gt;&lt;pre&gt;    L_05e4: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05e5: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_05e6: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05e7: ldnull &lt;/pre&gt;&lt;pre&gt;    L_05e8: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05ed: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_05ee: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05ef: ldc.i4.1 &lt;/pre&gt;&lt;pre&gt;    L_05f0: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05f1: ldnull &lt;/pre&gt;&lt;pre&gt;    L_05f2: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_05f7: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    L_05f8: ldloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_05f9: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type&amp;gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre&gt;    L_05fe: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0603: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site10&lt;/pre&gt;&lt;pre&gt;    L_0608: br.s L_060a&lt;/pre&gt;&lt;pre class="alt"&gt;    L_060a: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site10&lt;/pre&gt;&lt;pre&gt;    L_060f: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0614: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site10&lt;/pre&gt;&lt;pre&gt;    L_0619: ldloc.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_061a: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site11&lt;/pre&gt;&lt;pre&gt;    L_061f: brtrue.s L_0653&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0621: ldstr &lt;span class="str"&gt;"Name"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    L_0626: ldtoken ExpandoObjectTesting.Program&lt;/pre&gt;&lt;pre class="alt"&gt;    L_062b: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)&lt;/pre&gt;&lt;pre&gt;    L_0630: ldc.i4.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0631: newarr [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&lt;/pre&gt;&lt;pre&gt;    L_0636: stloc.1 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0637: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0638: ldc.i4.0 &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0639: ldc.i4.0 &lt;/pre&gt;&lt;pre&gt;    L_063a: ldnull &lt;/pre&gt;&lt;pre class="alt"&gt;    L_063b: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, &lt;span class="kwrd"&gt;string&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    L_0640: stelem.&lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0641: ldloc.1 &lt;/pre&gt;&lt;pre&gt;    L_0642: newobj instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder::.ctor(&lt;span class="kwrd"&gt;string&lt;/span&gt;, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Type, &lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Collections.Generic.IEnumerable`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&amp;gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0647: call &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;!0&amp;gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Create(&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSiteBinder)&lt;/pre&gt;&lt;pre&gt;    L_064c: stsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site11&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0651: br.s L_0653&lt;/pre&gt;&lt;pre&gt;    L_0653: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site11&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0658: ldfld !0 [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;::Target&lt;/pre&gt;&lt;pre&gt;    L_065d: ldsfld &lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite`1&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; ExpandoObjectTesting.Program/&amp;lt;Main&amp;gt;o__SiteContainer0::&amp;lt;&amp;gt;p__Site11&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0662: ldloc.0 &lt;/pre&gt;&lt;pre&gt;    L_0663: callvirt instance !2 [mscorlib]System.Func`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1)&lt;/pre&gt;&lt;pre class="alt"&gt;    L_0668: callvirt instance &lt;span class="kwrd"&gt;void&lt;/span&gt; [mscorlib]System.Action`3&amp;lt;&lt;span class="kwrd"&gt;class&lt;/span&gt; [System.Core]System.Runtime.CompilerServices.CallSite, &lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;::Invoke(!0, !1, !2)&lt;/pre&gt;&lt;pre&gt;    L_066d: nop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_066e: call &lt;span class="kwrd"&gt;string&lt;/span&gt; [mscorlib]System.Console::ReadLine()&lt;/pre&gt;&lt;pre&gt;    L_0673: pop &lt;/pre&gt;&lt;pre class="alt"&gt;    L_0674: ret &lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;För att göra en lång historia kort... Det som sker är att det först skapas upp en instans av ExpandoObject, vilket ger ett object. Sedan används ett antal CallSites för att skapa upp en dynamisk call site som har hand om alla dynamiska handlingar som sker mot objektet.
&lt;p&gt;När objektet binds så returneras ett expression tree med data för objektet, vilket sedan används för att arbeta med de metoder och den data som vi tidigare har skapat.
&lt;p&gt;Då objekten skapas upp under runtime så kan vi även använda dem runt om i applikationen, vilket gör att vi kan göra t.ex. så här:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; dynamic GetExpendo()&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    dynamic magic = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExpandoObject();&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    magic.IntX = 10;&lt;/pre&gt;&lt;pre&gt;    magic.IntY = 20;&lt;/pre&gt;&lt;pre class="alt"&gt;    magic.Name = &lt;span class="str"&gt;"Nisse"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;    magic.SayHello = &lt;span class="kwrd"&gt;new&lt;/span&gt; Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;(x =&amp;gt; Console.WriteLine(&lt;span class="str"&gt;"Hello, "&lt;/span&gt; + x + &lt;span class="str"&gt;"!"&lt;/span&gt;));&lt;/pre&gt;&lt;pre class="alt"&gt;    magic.Multiply = &lt;span class="kwrd"&gt;new&lt;/span&gt; Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;((x, y) =&amp;gt; x * y);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; magic;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Vi kan sedan skapa upp objektet genom:
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;dynamic magic = GetExpendo();&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Det här fungerar lika bra som innan. Med andra ord så behandlas dynamiska ExpandoObject-instanser på samma sätt som vanliga statiska instanser.
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7223988" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category></item><item><title>Bygg ut dina applikationer med dynamic i .NET 4.0</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/bygg-ut-dina-applikationer-med-dynamic-i-net-4-0.aspx</link><pubDate>Tue, 06 Oct 2009 09:08:53 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7223948</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7223948</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7223948</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/10/06/bygg-ut-dina-applikationer-med-dynamic-i-net-4-0.aspx#comments</comments><description>&lt;p&gt;I C# 4.0 så kommer ett nytt keyword kallat ”dynamic”. Precis som ”var” i C# 3.5 så säger det inget om vilken typ det är när man skriver. Skillnaden mot var är att var blir hårt typad vid kompilering, medan dynamic blir det vid runtime.&lt;/p&gt;  &lt;p&gt;Så, varför skulle vi vilja typa variablerna vid runtime? När man arbetar med COM som i t.ex. Office-biblioteken så är inte allt hårt typat, när man anropar DOM:en via Silverlight så är det inte heller starkt typat mot det enskilta objektet och om vi vill köra kod i ett språk baserat på DLR så är det förstås inte heller starkt typat.&lt;/p&gt;  &lt;p&gt;Det vi kan göra med dynamic är att vi kan anropa en metod i något av dessa bibliotek trots att .NET inte känner till att metoden finns under kompileringen. När vi däremot kör koden så ser .NET att objektet finns, och kör därefter den metoden vi just bad om.&lt;/p&gt;  &lt;p&gt;Istället för att ta ett objekt och peka på en metod som vi vill anropa så tar vi ett objekt och säger att vi vill anropa en metod med ett visst namn.&lt;/p&gt;  &lt;p&gt;Fördelen med det här är att vi enkelt kan anropa metoder som nödvändigtvis inte behöver när vi kompilerar, men som kommer att finnas när vi kör applikationen. Om nu inte metoden finns så får vi ett felmeddelande när vi anropar metoden.&lt;/p&gt;  &lt;p&gt;Men varför vill vi blanda t.ex. C# och IronRuby i våra applikationer? Tänk dig att vi har en applikation som vi vill att användarna skall kunna bygga ut enkelt. Om vi skriver applikationen i C# och vill utöka funktionaliteten med t.ex. C# eller Visual Basic så kan vi använda MEF eller liknande för att få den funktionaliteten. Det här kräver dock att användaren skriver sin kod, kompilerar den och sedan lägger den i en mapp som vi sedan läser in. Fördelen med ett dynamiskt språk som IronRuby är att den inte behöver kompileras, utan kan köras direkt. Vi gör det därmed möjligt för personer att enkelt skriva ihop en fil som gör det de vill och sedan låter dem injicera koden i vår applikation.&lt;/p&gt;  &lt;p&gt;I exemplet jag kommer att gå igenom så använder jag Visual Studio 2010 Beta 1 med .NET 4.0 Beta 1 och den versionen av IronRuby som finns tillgänglig för just dessa. IronRuby för .NET 4.0 Beta 1 finns att ladda ned här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27606"&gt;http://ironruby.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27606&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vi börjar med att skapa ett console-projekt och lägger till referenser till Microsoft.Scripting, IronRuby och IronRuby.Libraries. Det finns även assemblies för IronPython för de som föredrar det.&lt;/p&gt;  &lt;p&gt;Applikationen vi ska skriva nu kommer att hämta alla rb-filer (IronRuby) och köra en metod vid namn ”sayhello” i klassen ”RubyTest”.&lt;/p&gt;  &lt;p&gt;Jag kommer att ha två olika rb-filer i exemplet, den ena skriver ut en rad direkt i programmet, och den andra kommer att visa en MessageBox med det inmatade värdet.&lt;/p&gt;  &lt;p&gt;Console.rb:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; RubyTest&lt;/pre&gt;

  &lt;pre&gt;  def sayhello&lt;/pre&gt;

  &lt;pre class="alt"&gt;    input = System::Console.ReadLine&lt;/pre&gt;

  &lt;pre&gt;    System::Console::WriteLine &lt;span class="str"&gt;&amp;quot;Ruby says: &amp;quot;&lt;/span&gt; + input&lt;/pre&gt;

  &lt;pre class="alt"&gt;  end&lt;/pre&gt;

  &lt;pre&gt;end&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;msgbox.rb&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;require &lt;span class="str"&gt;'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; RubyTest&lt;/pre&gt;

  &lt;pre&gt;  def sayhello&lt;/pre&gt;

  &lt;pre class="alt"&gt;    input = System::Console.ReadLine&lt;/pre&gt;

  &lt;pre&gt;    System::Windows::Forms::MessageBox.Show input, &lt;span class="str"&gt;&amp;quot;Ruby says&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;  end&lt;/pre&gt;

  &lt;pre&gt;end&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;I båda fallen så läser vi in en sträng i programmet som vi sedan använder oss utav. Vi kommer alltså åt programmet utan att filerna på något sätt har med det att göra, utöver det faktum att de körs från det.&lt;/p&gt;

&lt;p&gt;Det vi behöver göra nu är att läsa in filerna från console-programmet och köra sayhello-metoderna.&lt;/p&gt;

&lt;p&gt;Grundstommen för vårt program ser ut så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; IronRuby;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.Scripting.Hosting;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; IronRubyConsole&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre class="alt"&gt;    {&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            DirectoryInfo di = &lt;span class="kwrd"&gt;new&lt;/span&gt; DirectoryInfo(Environment.CurrentDirectory + &lt;span class="str"&gt;&amp;quot;\\scripts&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            CallRuby(di.GetFiles(&lt;span class="str"&gt;&amp;quot;*.rb&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            Console.ReadKey();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CallRuby(FileInfo[] files)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (FileInfo file &lt;span class="kwrd"&gt;in&lt;/span&gt; files)&lt;/pre&gt;

  &lt;pre&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;                Console.WriteLine(&lt;span class="str"&gt;&amp;quot;{0}------------{0}{1}{0}------------&amp;quot;&lt;/span&gt;, Environment.NewLine, file.Name);&lt;/pre&gt;

  &lt;pre&gt;                ExecuteRuby(file.FullName);&lt;/pre&gt;

  &lt;pre class="alt"&gt;            }&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ExecuteRuby(&lt;span class="kwrd"&gt;string&lt;/span&gt; path)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi loopar igenom alla rb-filer i mappen “scripts” som ligger i samma mapp som exe-filen. Sedan anropar vi metoden ExecuteRuby() där vi kommer att köra filerna.&lt;/p&gt;

&lt;p&gt;Koden som vi använder i ExecuteRuby är:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;ScriptEngine engine = Ruby.CreateEngine();&lt;/pre&gt;

  &lt;pre&gt;engine.ExecuteFile(path);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;object&lt;/span&gt; rubyclass = engine.Runtime.Globals.GetVariable(&lt;span class="str"&gt;&amp;quot;RubyTest&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;dynamic rubytest = engine.Operations.CreateInstance(rubyclass);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;rubytest.sayhello();&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;För att köra våra IronRuby-filer så behöver vi skapa ett ScriptEnginge-objekt som finns under Microsoft.Scripting.Hosting. Den ScriptEnginge vi använder är den som finns för IronRuby. Det finns även en för IronPython.&lt;/p&gt;

&lt;p&gt;När vi har en ScriptEngine så kan vi exekvera filen som vi fick in via parametern.&lt;/p&gt;

&lt;p&gt;Sedan anropar vi klassen RubyTest och skapar en instans av den.&lt;/p&gt;

&lt;p&gt;Då variabeln ”rubytest” är satt som dynamic så kan vi anropa vilken metod som helst och kompilera, även om metoden inte är skapad än. Det kan vi se på den nedersta raden, ”rubytest.sayhello();”.&lt;/p&gt;

&lt;p&gt;Om sayhello tar emot en parameter i IronRuby-filen så kan vi skicka med den som vanligt i anropet.&lt;/p&gt;

&lt;p&gt;När vi nu kör applikationen och fyller den med text så får vi upp det här:&lt;/p&gt;

&lt;p&gt;&lt;img title="1 - Execute" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="210" alt="1 - Execute" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Execute_1334AAB8.png" width="509" border="0" /&gt; &lt;/p&gt;

&lt;p&gt;Vi kan alltså på ett väldigt enkelt sätt göra det möjligt för användarna av våra program att skriva script i IronRuby och andra dynamiska språk.&lt;/p&gt;

&lt;p&gt;Jag har lagt upp projektet här (kräver .NET 4.0 Beta 1 för att kunna köras):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cid-4aa13e17331c7398.skydrive.live.com/self.aspx/Public/VS%202010%20%5E0%20.NET%204.0/IronRubyConsole.rar"&gt;http://cid-4aa13e17331c7398.skydrive.live.com/self.aspx/Public/VS%202010%20%5E0%20.NET%204.0/IronRubyConsole.rar&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7223948" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/IronRuby/default.aspx">IronRuby</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category></item><item><title>Förstå Expression Trees</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/09/27/f-246-rst-229-expression-trees.aspx</link><pubDate>Sun, 27 Sep 2009 12:10:11 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7217862</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7217862</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7217862</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/09/27/f-246-rst-229-expression-trees.aspx#comments</comments><description>&lt;p&gt;När man arbetar med data som inte ligger i objekt i minnet (vanliga POCO-collections) som t.ex. SQL så har man tidigare behövt skriva en SQL-sats som gör det man vill, vilket kan vara att hämta data, att lägga till data, att ta bort data samt att uppdatera data i databasen. Med Linq to SQL och Linq to Entities, vilka kom i .NET 3.5 respektive .NET 3.5 SP 1 så har det blivit mycket enklare.&lt;/p&gt;  &lt;p&gt;Med dessa så används ett nytt interface kallat IQueryable&amp;lt;T&amp;gt;. Detta implementerar IEnumerable, vilket vi har kunnat använda sedan länge. Skillnaden mellan IQueryable och IEnumerable är hur de behandlar datan. Anledningen till att Linq använder sig utav IQueryable är möjligheten till att använda en nyhet kallad &lt;b&gt;Expression Trees&lt;/b&gt;, vilket jag kommer att gå igenom här. &lt;/p&gt;  &lt;p&gt;För att göra det enklare att studera Expression Trees så kan jag rekommendera att du laddar ned en visualizer som följer med i CSharp Samples for Visual Studio 2008. Du kan ladda ned det här:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/csharpsamples"&gt;http://code.msdn.microsoft.com/csharpsamples&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;När exemplen är nedladdade och uppackade så öppnar projektet som finns under &lt;i&gt;LinqSamples\ExpressionTreeVisualizer&lt;/i&gt;. Kompilera sedan ExpressionTreeVisualizer i release-läget och kopiera &lt;i&gt;ExpressionTreeVisualizer.dll&lt;/i&gt; till &lt;i&gt;Mina Dokument\Visual Studio 2008\Visualizers&lt;/i&gt;. När detta är gjort så skapar vi ett nytt projekt (jag använder ett Console-projekt) och skriver in detta:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; isTenTree = x =&amp;gt; x == 10;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När vi nu kör programmet i debug-läge, så får vi möjlighet att se hur vårt Expression Tree ser ut:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Visualizerknapp_4FE177C6.png"&gt;&lt;img title="1 - Visualizerknapp" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="120" alt="1 - Visualizerknapp" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/1Visualizerknapp_thumb_09F56608.png" width="523" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;När vi klickar på förstoringsglaset:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/2Visualizer_091F90CF.png"&gt;&lt;img title="2 - Visualizer" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="537" alt="2 - Visualizer" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/2Visualizer_thumb_1B0F26D6.png" width="353" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Genom att sätta vår &lt;i&gt;Func&amp;lt;&amp;gt;&lt;/i&gt; som en &lt;i&gt;Expression&amp;lt;Func&amp;lt;&amp;gt;&amp;gt;&lt;/i&gt; så har vi gjort om den till ett Expression Tree. Som ni kan se i bilden ovan så är det en trädvy.&lt;/p&gt;

&lt;p&gt;När vi skapar en Func&amp;lt;&amp;gt; så blir det en kompilerad funktion som vi kan avända oss utav direkt och köra, men när vi har en Expression&amp;lt;&amp;gt; så blir det en trädvy som måste kompileras.&lt;/p&gt;

&lt;p&gt;Hade det här bara varit en Func&amp;lt;&amp;gt; så hade vi kunnat köra det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt; isTen = x =&amp;gt; x == 10;&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(isTen(10));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Och fått resultatet ”True” utskrivet på skärmen.&lt;/p&gt;

&lt;p&gt;Kör vi istället med en Expression som inte är kompilerad så måste vi kompilera den för att kunna köra den. Vi kan alltså inte ta ett träd och och ställa frågor mot det direkt.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; isTenTree = x =&amp;gt; x == 10;&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(isTenTree.Compile()(10));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det här ger samma resultat som koden innan. Genom att köra Compile()-metoden så kompileras vårt träd och vi kan köra det.&lt;/p&gt;

&lt;h4&gt;Varför ska man använda Expression Trees?&lt;/h4&gt;

&lt;p&gt;När man skall hämta data som inte finns i minnet på den aktuella servern så är det möjligt att vi måste skriva om koden. Det kan till exempel vara SQL som jag nämnde innan, men även till exempel Web Services (SOAP), SharePoint (CAML), JSON eller något annat. Genom att använda Expression Trees som inte är kompilerade så kan vi på ett enklare sätt läsa ut hur anropet skall se ut än om vi hade använt en kompilerad motsvarighet.&lt;/p&gt;

&lt;p&gt;Skillnaden mellan Expression&amp;lt;Func&amp;lt;&amp;gt;&amp;gt; och Func&amp;lt;&amp;gt; är alltså att det förstnämnda är en datastruktur medan det andra är kompilerad kod.&lt;/p&gt;

&lt;h4&gt;Uppbyggnaden av Expression Trees&lt;/h4&gt;

&lt;p&gt;Expression&amp;lt;T&amp;gt; har fyra properties som vi kan använda oss utav för att kunna tolka hur datan skall hämtas.&lt;/p&gt;

&lt;p&gt;Det är:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Body &lt;/li&gt;

  &lt;li&gt;Parameters&lt;/li&gt;

  &lt;li&gt;NodeType&lt;/li&gt;

  &lt;li&gt;Type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Om vi kikar på bilden ovan så kan vi se att vi i det exemplet har:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/3VisualizerProperties_57EDEB6C.png"&gt;&lt;img title="3 - VisualizerProperties" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="537" alt="3 - VisualizerProperties" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/3VisualizerProperties_thumb_48E31E60.png" width="353" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;b&gt;1. Body&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Body är av typen ExpressionEqual, vilket beror på att vi har ”==” för jämförelsen. Hade vi istället haft ”&amp;gt;” så hade det varit GreaterThan.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2. Parameters&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Vi skickar med en parameter kallad ”x” som är av typen Int32.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3. NodeType&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Det vi har använt är en Lambda Expression.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;4. Type&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Typen är en Func&amp;lt;Int32, Boolean&amp;gt;, vilket stämmer överens med det vi skapade.&lt;/p&gt;

&lt;p&gt;Vi kan alltså med den här informationen se att det vi ska ha är data där den inskickade parametern x har ett värde som är lika med 10, och om så är fallet så returnerar vi true.&lt;/p&gt;

&lt;p&gt;Vi kan även använda mer avancerade exempel med fler parametrar.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; isTenTree2 = (x, y) =&amp;gt; x + y;&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(isTenTree2.Compile()(10, 20));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;I det här exemplet så tar vi emot två parametrar av typen Int32 och returnerar sedan summan av dem som en Int32.&lt;/p&gt;

&lt;p&gt;Vårt Expression Tree ser nu ut på detta sätt:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/4TwoParameters_1FFFBB6A.png"&gt;&lt;img title="4 - TwoParameters" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="601" alt="4 - TwoParameters" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/4TwoParameters_thumb_0291CA19.png" width="353" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Om vi ska tolka detta så kan vi se att:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;1. Body&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Body är av typen ExpressionAdd då vi summerar värdena i det.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2. Parameters&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Vi har två parametrar, båda av typen Int32.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3. NodeType&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;NodeType är en Lambda Expression.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;4. Type&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Typen är en Func&amp;lt;Int32, Int32, Int32&amp;gt;, då vi skickar in två Int32 och sedan returnerar en tredje.&lt;/p&gt;

&lt;h4&gt;Skapa expressions programmatiskt&lt;/h4&gt;

&lt;p&gt;Istället för att direkt ange hur vår expression skall vara uppbyggd så kan vi istället skapa den från grunden själva.&lt;/p&gt;

&lt;p&gt;För att skapa den senaste frågan ((x, y) =&amp;gt; x + y) så kan vi skriva detta:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;ParameterExpression paramX = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Int32), &lt;span class="str"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;ParameterExpression paramY = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Int32), &lt;span class="str"&gt;&amp;quot;y&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;BinaryExpression body = Expression.Add(paramX, paramY);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;ParameterExpression[] parameters = &lt;span class="kwrd"&gt;new&lt;/span&gt; ParameterExpression[] { paramX, paramY };&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;Expression&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt; result = Expression.Lambda&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt;(body, parameters);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det vi gör här är att vi först skapar de två parametrarna, x och y. Sedan skapar vi en BinaryExpression med dessa två parametrar. För att de skall skickas in som parametrar i vårt Expression Tree så behöver vi även ange dem när vi till sist skapar själva frågan.&lt;/p&gt;

&lt;p&gt;Om vi kompilerar och debuggar så kan vi se att vi har fått exakt samma Expression Tree som tidigare.&lt;/p&gt;

&lt;p&gt;Vi kan även läsa av dessa propertys ur det skapade Expression Tree vi har. För enkelhetens skull så har jag skapat en metod för att skriva ut innehållet:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteExpression(Expression&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt; exp)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.Clear();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Body\n-----&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Body.NodeType: {0}&amp;quot;&lt;/span&gt;, exp.Body.NodeType.ToString());&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Body.NodeType: {0}&amp;quot;&lt;/span&gt;, exp.Body.Type.ToString());&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine();&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;NodeType\n-----&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;NodeType: {0}&amp;quot;&lt;/span&gt;, exp.NodeType.ToString());&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Parameters\n-----&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ParameterExpression p &lt;span class="kwrd"&gt;in&lt;/span&gt; exp.Parameters)&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;{0}&amp;quot;&lt;/span&gt;, p.Name);&lt;/pre&gt;

  &lt;pre&gt;        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tNodeType: {0}&amp;quot;&lt;/span&gt;, p.NodeType.ToString());&lt;/pre&gt;

  &lt;pre class="alt"&gt;        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\tType: {0}&amp;quot;&lt;/span&gt;, p.Type.ToString());&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Type\n-----&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Type: {0}&amp;quot;&lt;/span&gt;, exp.Type.ToString());&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi tar här emot en Expression&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt; och skriver ut innehållet ur den.&lt;/p&gt;

&lt;p&gt;När vi sedan anropar metoden med ”result” som parameter så får vi:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/5ExpressionTreeProperties_3276AE9E.png"&gt;&lt;img title="5 - ExpressionTreeProperties" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="260" alt="5 - ExpressionTreeProperties" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/5ExpressionTreeProperties_thumb_7D6CB01E.png" width="480" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Här har vi läst av alla parametrar och kan se att det är just det vi nyss skapade.&lt;/p&gt;

&lt;p&gt;För att kunna exekvera vårt Expression Tree så måste det kompileras innan det kan köras. Då det är en Expression&amp;lt;Func&amp;lt;Int32, Int32, Int32&amp;gt;&amp;gt; när det är okompilerat så blir det en Func&amp;lt;Int32, Int32, Int32&amp;gt; när det är kompilerat.&lt;/p&gt;

&lt;p&gt;Vi kan till exempel köra det så här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Func&amp;lt;Int32, Int32, Int32&amp;gt; summera = result.Compile();&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(summera(1, 2));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Resultatet blir här ”3”.&lt;/p&gt;

&lt;p&gt;De två parametrarna vi har skickat in (1 och 2) är vad som är Left och Right i ett Expression Tree.&lt;/p&gt;

&lt;p&gt;Om vi kör den här koden så får vi lätt fram den vänstra och högra sidan av ett Expression Tree:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;BinaryExpression exbody = (BinaryExpression)result.Body;&lt;/pre&gt;

  &lt;pre&gt;ParameterExpression exleft = (ParameterExpression)body.Left;&lt;/pre&gt;

  &lt;pre class="alt"&gt;ParameterExpression exright = (ParameterExpression)body.Right;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Left: {0}&amp;quot;&lt;/span&gt;, exleft.Name);&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Right: {0}&amp;quot;&lt;/span&gt;, exright.Name);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det här skrivet ut ”Left: x” och ”Right: y”, då det är de två parametrarna som används. Vi kan även få ut detta i Expression Tree Viewer på ett snyggt sätt:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/6LeftRightParameters_437FFDE3.png"&gt;&lt;img title="6 - LeftRightParameters" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="181" alt="6 - LeftRightParameters" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/6LeftRightParameters_thumb_0E75FF64.png" width="295" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Vi har alltså full insyn på hur vårt Expression Tree är uppbyggt.&lt;/p&gt;

&lt;h4&gt;Expression Trees != Lambda Expressions&lt;/h4&gt;

&lt;p&gt;Jag har visat upp lite exempel på Expression Trees och hur de används med Lambda Expressions, men de är inte samma sak. Vi kan använda Lambda Expressions för att skapa Expression Trees, eller så kan vi skapa dem manuellt som i det föregående exemplet. Alla Lambda Expressions kan dock ej förvandlas till Expression Trees.&lt;/p&gt;

&lt;p&gt;Ett exempel på det är:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; PrintParameter = s =&amp;gt; { Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Parameter: {0}&amp;quot;&lt;/span&gt;, s); };&lt;/pre&gt;

  &lt;pre&gt;Expression&amp;lt;Action&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; PrintParameterTree = s =&amp;gt; { Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Parameter: {0}&amp;quot;&lt;/span&gt;, s); };&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Den förstnämnda kan vi skapa utan problem, men när vi försöker skapa ett Expression Tree av den så får vi det här felmeddelandet:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;A lambda expression with a statement body cannot be converted to an expression tree&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Det är alltså två olika funktioner, men som i vissa fall kan användas tillsammans.&lt;/p&gt;

&lt;h4&gt;Linq to Entities&lt;/h4&gt;

&lt;p&gt;I det här exemplet så har jag skapat upp en enkel databas med en tabell (Customers) som har tre fält (id, FirstName, LastName). Jag har sedan skapat upp en Entity-modell med den här tabellen.&lt;/p&gt;

&lt;p&gt;Jag använder den här koden för att hämta ut alla personer där efternamnet slutar med ”son”:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Database1Entities ent = &lt;span class="kwrd"&gt;new&lt;/span&gt; Database1Entities();&lt;/pre&gt;

  &lt;pre&gt;var customers = ent.Customers.Where(c =&amp;gt; c.LastName.EndsWith(&lt;span class="str"&gt;&amp;quot;son&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var customer &lt;span class="kwrd"&gt;in&lt;/span&gt; customers)&lt;/pre&gt;

  &lt;pre class="alt"&gt;{&lt;/pre&gt;

  &lt;pre&gt;    Console.WriteLine(customer.FirstName);&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;När vi nu debuggar så får vi fram:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/7EntitiesDebug_58FFCDEF.png"&gt;&lt;img title="7 - EntitiesDebug" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="138" alt="7 - EntitiesDebug" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/7EntitiesDebug_thumb_0CD1455E.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Då Linq to Entities är uppbyggt med Expression Trees så kan vi få fram hur det är uppbyggt när frågan ställs. Klicka på förstoringsglaset för att få fram visualizern:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/8EntitiesDebugVisualizer_2A98FEE2.png"&gt;&lt;img title="8 - EntitiesDebugVisualizer" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="844" alt="8 - EntitiesDebugVisualizer" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/8EntitiesDebugVisualizer_thumb_53F90656.png" width="602" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Vi kan se här att det precis som tidigare är ett vanligt Expression Tree, vilket vi skulle kunna bygga dynamiskt om vi vill. Vi behöver alltså inte använda Linq-frågor, eller Lambda Expressions, utan vi kan själva generera det här trädet och på så vis ställa egna frågor.&lt;/p&gt;

&lt;p&gt;Om vi ser vilken Type som används (längst ned i bilden) så ser vi att det är en IQueryable&amp;lt;Customers&amp;gt;, vilket gör det möjligt att skapa upp detta Expression Tree. Hade vi kört frågan mot vanliga POCO-objekt så hade vi istället använt en IEnumerable&amp;lt;Customers&amp;gt; då frågorna inte behöver skrivas om.&lt;/p&gt;

&lt;p&gt;Då det är ett Expression Tree som lätt kan tolkas så gör det att Entity Framework lätt kan använda SQL Server-providern för att skriva om detta till en lämplig SQL-sats. För att gå ett steg längre i felsökningen så kan vi ladda ned en visualizer för det. Ni hittar en här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/99468ece-689b-481c-868c-19e00e0a4e69"&gt;http://visualstudiogallery.msdn.microsoft.com/en-us/99468ece-689b-481c-868c-19e00e0a4e69&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ladda ned dll-filen och lägg i Visualizers-mappen precis som tidigare och starta om Visual Studio. När vi sedan debuggar koden igen så får vi fram det här:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/9EntityVisualizer_3B28D1D2.png"&gt;&lt;img title="9 - EntityVisualizer" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="52" alt="9 - EntityVisualizer" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/9EntityVisualizer_thumb_25640AD7.png" width="556" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Och när vi klickar där:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/mikaelsoderstrom/10EntityVisualizerView_2904B665.png"&gt;&lt;img title="10 - EntityVisualizerView" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="554" alt="10 - EntityVisualizerView" src="http://weblogs.asp.net/blogs/mikaelsoderstrom/10EntityVisualizerView_thumb_58B51584.png" width="763" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Här kan vi enkelt se att vårt Expression Tree har översatts till:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;[Extent1].[id] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [id], &lt;/pre&gt;

  &lt;pre class="alt"&gt;[Extent1].[FirstName] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [FirstName], &lt;/pre&gt;

  &lt;pre&gt;[Extent1].[LastName] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [LastName]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt; [dbo].[Customers] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent1]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;WHERE&lt;/span&gt; (&lt;span class="kwrd"&gt;RIGHT&lt;/span&gt;([Extent1].[LastName], &lt;span class="kwrd"&gt;CAST&lt;/span&gt;(LEN(N&lt;span class="str"&gt;'son'&lt;/span&gt;) &lt;span class="kwrd"&gt;AS&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;))) = N&lt;span class="str"&gt;'son'&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Det här är den stora fördelen med Expression Trees, det är alltså möjligt att enkelt skriva om dessa till något som kan tolkas av systemet det kopplas mot.&lt;/p&gt;

&lt;h4&gt;Nyhet i .NET 4.0 – Skapa dynamiska metoder&lt;/h4&gt;

&lt;p&gt;En nyhet som kommer i .NET 4.0 är att vi på ett smidigt (allt är relativt..) sätt kan skapa dynamiska metoder. Tidigare så har vi varit tvungna att använda System.Reflection.Emit för att göra detta, vilket gör att vi hamnar i ”OpCode hell”. Med .NET 4.0 så går det att lösa mycket smidigare.&lt;/p&gt;

&lt;p&gt;För att köra det här så behöver du Visual Studio 2010 och .NET 4.0.&lt;/p&gt;

&lt;p&gt;Till skillnad från .NET 3.5 där vi har Expression Trees och därmed kan skapa Expressions med kod, så har vi i .NET 4.0 även stöd för Statement Trees. Med dessa kan vi dynamiskt skapa metoder utan att behöva blanda in IL.&lt;/p&gt;

&lt;p&gt;Metoden vi kommer att skapa nu motsvarar det här:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; DynamicMethod(&lt;span class="kwrd"&gt;int&lt;/span&gt; parameter)&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt; = 0;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;do&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 10)&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;value&lt;/span&gt; += parameter;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    } &lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Vi kommer att skicka in en parameter med värdet ”3” till den här metoden. Sedan körs en loop till dess att if-satsen inte är giltig längre. Om vi kör den här koden kommer resultatet att bli ”12”.&lt;/p&gt;

&lt;p&gt;Motsvarande med Statement Expressions är detta:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Skapa en ParameterExpression som tillhandahåller det inskickade värdet&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;ParameterExpression parameter = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;&amp;quot;parameter&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="rem"&gt;// Det lokala värdet som finns i bodyn i vår metod&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;ParameterExpression localvalue = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;&amp;quot;localvalue&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// En label för att kunna gå ut ur loopen&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;LabelTarget target = Expression.Label(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="rem"&gt;// Den dynamiska metodens body&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;BlockExpression block = Expression.Block(&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Skapar en lokal variabel i scopet&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt;[] { localvalue },&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;// Sätter värdet på localvalue till 0&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Expression.Assign(localvalue, Expression.Constant(0)),&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;    Expression.Loop(&lt;/pre&gt;

  &lt;pre&gt;        Expression.IfThenElse(&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Testar om value &amp;lt; 10&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            Expression.LessThan(localvalue, Expression.Constant(10, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Int32))),&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;// Om sant så lägg till det inskickade värdet&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Expression.AddAssign(localvalue, parameter),&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Om falskt så gå ut ur loopen&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;            Expression.Break(target, localvalue)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        ),&lt;/pre&gt;

  &lt;pre&gt;    &lt;span class="rem"&gt;// Gå ut ur loopen genom att gå till labeln&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        target&lt;/pre&gt;

  &lt;pre&gt;    )&lt;/pre&gt;

  &lt;pre class="alt"&gt;);&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Spara ned ett expression tree&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; dynamicmethod = Expression.Lambda&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt;(block, parameter);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Parametern som skapas i början är den som skickas in i metoden. Sedan skapar vi en lokal variabel som är den som vi i det tidigare exemplet kallar för ”value”. Efter det skapar vi en label, vilket motsvarar break;. Vi får använda denna label för att berätta att vi ska ut ur loopen när villkoret inte är giltigt längre, annars får vi en evighetsloop.&lt;/p&gt;

&lt;p&gt;Efter det kommer något som är nytt i C# 4.0, nämligen en BlockExpression, vilket gör det möjligt att skapa kodblock med egen logik i. I det här exemplet så har vi i den själva loopen med en if-sats i.&lt;/p&gt;

&lt;p&gt;Vi kan alltså med hjälp av Statement Expressions generera kod i C# som vi sedan kan kompilera med &lt;i&gt;dynamicmethod.Compile()&lt;/i&gt; och efter det anropa den precis som tidigare.&lt;/p&gt;

&lt;h4&gt;Sammanfattning&lt;/h4&gt;

&lt;p&gt;Expressions är otroligt kraftfulla verktyg för att kunna generera kod, antingen för att kunna kompilera till något annat språk som SQL, eller till C# eller ett dynamiskt språk (DLR använder Statement Expressions väldigt mycket för att generera kod).&lt;/p&gt;

&lt;p&gt;I C# 5.0 är det även sagt att det ska bli mer &lt;i&gt;Compiler as a Service&lt;/i&gt;, så vi lär definitivt se mer av detta framöver.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7217862" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/VS2010/default.aspx">VS2010</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category></item><item><title>C# 4.0 – Named och Optional Parameters</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/08/21/c-4-0-named-och-optional-parameters.aspx</link><pubDate>Fri, 21 Aug 2009 17:32:07 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7176686</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=7176686</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=7176686</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2009/08/21/c-4-0-named-och-optional-parameters.aspx#comments</comments><description>&lt;p&gt;När man utvecklar klasser som innehåller många överlagrade metoder så händer det ofta att man först har en “huvudmetod” som innehåller alla parametrar, och sedan ett par överlagrade metoder med ett visst antal parametrar, vilka sedan anropar huvudmetoden.&lt;/p&gt;  &lt;p&gt;Ett exempel på det är:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; OptionalNamedParameters&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OldParameters&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; HelloWorld(&lt;span class="kwrd"&gt;string&lt;/span&gt; Word1, &lt;span class="kwrd"&gt;string&lt;/span&gt; Word2, &lt;span class="kwrd"&gt;string&lt;/span&gt; Word3)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; String.Format(&lt;span class="str"&gt;&amp;quot;{0} {1} {2}&amp;quot;&lt;/span&gt;, Word1, Word2, Word3);&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; HelloWorld(&lt;span class="kwrd"&gt;string&lt;/span&gt; Word1, &lt;span class="kwrd"&gt;string&lt;/span&gt; Word2)&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; HelloWorld(Word1, Word2, &lt;span class="str"&gt;&amp;quot;Tom&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; HelloWorld(&lt;span class="kwrd"&gt;string&lt;/span&gt; Word1)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; HelloWorld(Word1, &lt;span class="str"&gt;&amp;quot;Tom&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Tom&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Här har vi tre överlagrade metoder. Den första har tre parametrar och returnerar alla strängar hopsatta med mellanslag som separator. De övriga två anropar den första, men med värdet ”Tom” för den eller de parametrar som inte används.&lt;/p&gt;

&lt;p&gt;Om vi sedan kör den här koden:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Console.WriteLine(OldParameters.HelloWorld(&lt;span class="str"&gt;&amp;quot;Hello,&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;world&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;!&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(OldParameters.HelloWorld(&lt;span class="str"&gt;&amp;quot;Hello,&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;world&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;Console.WriteLine(OldParameters.HelloWorld(&lt;span class="str"&gt;&amp;quot;Hello,&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Så får vi:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hello, world !
    &lt;br /&gt;Hello, world Tom

    &lt;br /&gt;Hello, Tom Tom&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Problemet här är att vi väldigt ofta behöver skapa metoder likt dessa för att ändå bara anropa en av dem, vilket gör att vi får fler metoder som inte tillför något.&lt;/p&gt;

&lt;p&gt;En lösning på detta har sedan länge funnits i Visual Basic, nämligen optional parameters. I och med .NET 4.0 så kan vi använda detta även med C#. Vi kan med optional parameters förkorta ned detta till enbart en enda metod, men som har standardvärden för de parametrar som inte behöver anges.&lt;/p&gt;

&lt;p&gt;För att göra detta så lägger vi till =”Standardvärde” efter parametern.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; OptionalNamedParameters&lt;/pre&gt;

  &lt;pre&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NewParameters&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; HelloWorld(&lt;span class="kwrd"&gt;string&lt;/span&gt; Word1, &lt;span class="kwrd"&gt;string&lt;/span&gt; Word2=&lt;span class="str"&gt;&amp;quot;Tom&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt; Word3=&lt;span class="str"&gt;&amp;quot;Tom&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; String.Format(&lt;span class="str"&gt;&amp;quot;{0} {1} {2}&amp;quot;&lt;/span&gt;, Word1, Word2, Word3);&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;

  &lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Här har vi först en obligatorisk parameter (Word1), och sedan två valfria med standardvärden satta. Genom att lägga till ett standardvärde så blir parametern automatiskt valfri att använda. Om parametern inte skickas in så används standardvärdet.&lt;/p&gt;

&lt;p&gt;För att använda detta så kan vi köra samma kod som innan (jag har dock ett annat klassnamn i exemplet):&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Console.WriteLine(NewParameters.HelloWorld(&lt;span class="str"&gt;&amp;quot;Hello,&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;world&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;!&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(NewParameters.HelloWorld(&lt;span class="str"&gt;&amp;quot;Hello,&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;world&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;Console.WriteLine(NewParameters.HelloWorld(&lt;span class="str"&gt;&amp;quot;Hello,&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Detta ger samma resultat som innan:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hello world !
    &lt;br /&gt;Hello world Tom

    &lt;br /&gt;Hello Tom Tom&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Genom att sätta standardvärden på de två valfria parametrarna så har vi gått från tre metoder till en enda. Det här gör koden mer lättläst och lättare att underhålla. Vid de fall där man har många olika varianter så kan det göra stor skillnad.&lt;/p&gt;

&lt;p&gt;Problemet nu uppstår om vi vill använda specifika parametrar här, och inte alla i ordning. Det kan vi lösa med en annan nyhet – named parameters.&lt;/p&gt;

&lt;p&gt;För att använda named parameters så anger vi vid anropet namnet på parametern och dess värde separerat med kolon. Parametrarna behöver inte anges i rätt ordning, utan vi kan blanda som vi vill.&lt;/p&gt;

&lt;p&gt;Om vi tar den nya klassen med bara en metod så kan vi enkelt använda detta:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Console.WriteLine(NewParameters.HelloWorld(Word3: &lt;span class="str"&gt;&amp;quot;!&amp;quot;&lt;/span&gt;, Word2: &lt;span class="str"&gt;&amp;quot;world&amp;quot;&lt;/span&gt;, Word1: &lt;span class="str"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(NewParameters.HelloWorld(Word2: &lt;span class="str"&gt;&amp;quot;world&amp;quot;&lt;/span&gt;, Word1: &lt;span class="str"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre class="alt"&gt;Console.WriteLine(NewParameters.HelloWorld(Word1: &lt;span class="str"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Här anropar vi parametrarna i bakvänd ordning. Vi anropar dock exakt samma parametrar med samma värden som innan, så om vi kör det så får vi återigen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hello world !
    &lt;br /&gt;Hello world Tom

    &lt;br /&gt;Hello Tom Tom&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Det är även möjligt att ange parametrarna som vanligt, samtidigt som vi använder namngivna parametrar för de resterande parametrarna.&lt;/p&gt;

&lt;p&gt;Ett exempel på det är:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;Console.WriteLine(NewParameters.HelloWorld(&lt;span class="str"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;, Word3: &lt;span class="str"&gt;&amp;quot;!&amp;quot;&lt;/span&gt;, Word2: &lt;span class="str"&gt;&amp;quot;world&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre&gt;Console.WriteLine(NewParameters.HelloWorld(&lt;span class="str"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;, Word2: &lt;span class="str"&gt;&amp;quot;world&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;I det första exemplet så anger vi “Hello” som den första parametern, “!” som den tredje parametern (dock tvåa i ordningen), samt ”world” som den andra parametern (sist i ordningen). Vi kan inte flytta den första parametern här, utan de som inte är namngivna måste vi ange innan de som är namngivna.&lt;/p&gt;

&lt;p&gt;Tack vare stödet för named och optional parameters i C# 4.0 så kan vi förminska antalet rader kod och samtidigt få den mer läsvänlig.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7176686" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category></item><item><title>C# 4.0 – Dynamiska objekt</title><link>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/10/28/c-4-0-dynamiska-objekt.aspx</link><pubDate>Tue, 28 Oct 2008 11:37:24 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6708133</guid><dc:creator>Vimpyboy</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/rsscomments.aspx?PostID=6708133</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/mikaelsoderstrom/commentapi.aspx?PostID=6708133</wfw:comment><comments>http://weblogs.asp.net/mikaelsoderstrom/archive/2008/10/28/c-4-0-dynamiska-objekt.aspx#comments</comments><description>&lt;p&gt;I C# 3.0 kunde vi se en ny typ av objekt som kallas för “var”. Det som händer vid kompilering är att det här:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;var a = “Hello, World!”;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;kompileras till:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; a = &lt;span class="str"&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;En nyhet i C# 4.0 är stöd för dynamiska objekt. Skillnaden mellan dessa är att de inte kompileras till “rätt” typ direkt vid kompilering, utan allt sker vid runtime. Det gör att vi på ett lättare sätt kan ta t.ex. javascript och skriva om det till C#.&lt;/p&gt;

&lt;p&gt;För att visa att ett objekt skall vara dynamiskt använder vi det nya nyckelordet “dynamic”.&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;dynamic a = &lt;span class="str"&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Det kompileras inte till en string, utan det blir en vid runtime.&lt;/p&gt;

&lt;p&gt;Jag kommer med fler exempel senare när jag har hunnit testa runt lite. :-)&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6708133" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/mikaelsoderstrom/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category></item></channel></rss>