Reflector 反編譯 (設定 .NET 2.0 語法)
internal class Program
{
private static void Main()
{
object d = "str";
if (<Main>o__SiteContainer0.<>p__Site1 == null)
{
<Main>o__SiteContainer0.<>p__Site1 = CallSite<Action<CallSite, object>>.Create(
new CSharpInvokeMemberBinder(CSharpCallFlags.None, "ToString", typeof(Program), null,
new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) }));
}
<Main>o__SiteContainer0.<>p__Site1.Target(<Main>o__SiteContainer0.<>p__Site1, d);
}
[CompilerGenerated]
private static class <Main>o__SiteContainer0
{
public static CallSite<Action<CallSite, object>> <>p__Site1;
}
}
關鍵觀察
- 動態變量編譯為
object:dynamic d = "str" → object d = "str"。
- CallSite 快取模式:靜態巢狀類別持有
CallSite 欄位,首次使用時建立並快取。
- 調用流程:
CallSite.Target(CallSite, args) 執行動態綁定。
值型別裝箱驗證
dynamic d = 5; // int
d.ToString();
反編譯同樣為
object d = 5,確認發生
裝箱。動態呼叫值型別會導致額外配置與複製,效能敏感場合需謹慎使用。