標籤:style blog color os ar div log sp line
private static void TestMethod(){ //dynamic 僅僅是個預留位置而已 dynamic p1 = new { X = 1, Y = 89 }; //對dynamic對象p1的X屬性訪問通過CallSite來實現,並且CallSite可以Cache object p1x = p1.X; object p1y = p1.Y; //dynamic 僅僅是個預留位置而已 dynamic p2 = new { X = 1, Y = 89, Z = 3 }; object p2x = p2.X; object p2y = p2.Y; object p2z = p2.Z;}
對於如上所示的含有dynamic調用的C#方法編譯後大致的結果如下:
using System;using Microsoft.CSharp.RuntimeBinder;using System.Runtime.CompilerServices;private static void TestMethod(){ object p1 = new { X = 1, Y = 0x59 }; if (TestMethod_SiteContainer.p_Sitea == null) { TestMethod_SiteContainer.p_Sitea = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, "X", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); } object p1x = TestMethod_SiteContainer.p_Sitea.Target(TestMethod_SiteContainer.p_Sitea, p1); if (TestMethod_SiteContainer.p_Siteb == null) { TestMethod_SiteContainer.p_Siteb = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, "Y", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); } object p1y = TestMethod_SiteContainer.p_Siteb.Target(TestMethod_SiteContainer.p_Siteb, p1); object p2 = new { X = 1, Y = 0x59, Z = 3 }; if (TestMethod_SiteContainer.p_Sitec == null) { TestMethod_SiteContainer.p_Sitec = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, "X", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); } object p2x = TestMethod_SiteContainer.p_Sitec.Target(TestMethod_SiteContainer.p_Sitec, p2); if (TestMethod_SiteContainer.p_Sited == null) { TestMethod_SiteContainer.p_Sited = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, "Y", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); } object p2y = TestMethod_SiteContainer.p_Sited.Target(TestMethod_SiteContainer.p_Sited, p2); if (TestMethod_SiteContainer.p_Sitee == null) { TestMethod_SiteContainer.p_Sitee = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, "Z", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); } object p2z = TestMethod_SiteContainer.p_Sitee.Target(TestMethod_SiteContainer.p_Sitee, p2);}[CompilerGenerated]private static class TestMethod_SiteContainer{ // Fields public static CallSite<Func<CallSite, object, object>> p_Sitea; public static CallSite<Func<CallSite, object, object>> p_Siteb; public static CallSite<Func<CallSite, object, object>> p_Sitec; public static CallSite<Func<CallSite, object, object>> p_Sited; public static CallSite<Func<CallSite, object, object>> p_Sitee;}
C#編譯器對於dynamic對象到底做了什麼