[C# 4.0] 1. Dynamic
2010-09-30 21:04:24 来源:WEB开发网事情好像搞大发了,出来这么一大堆,有点晕~~~~。编译器自动创建一个静态类持有一些静态字段,在第一次调用前创建 CallSite<T> 类型的数据,以后都是通过 CallSite<T>.Target 来完成 "动态调用"。可见 CallSite<T> 通过某种途径 "封装" 了动态调用过程。Binder 为这种封装提供了所需的绑定信息。
为了便于分析,我们用一个简单点的例子来完成对过程的跟踪。
class MyClass
{
public void Test()
{
Console.WriteLine("Hello, World!");
}
}
class Program
{
static void Main(string[] args)
{
dynamic o = new MyClass();
o.Test();
}
}
反编译代码
[CompilerGenerated]
private static class SiteContainer0
{
// Fields
public static CallSite<Action<CallSite, object>> site1;
}
private static void Main(string[] args)
{
object o = new MyClass();
if (SiteContainer0.site1 == null)
{
SiteContainer0.site1 = CallSite<Action<CallSite, object>>.Create
(
Binder.InvokeMember
(
CSharpBinderFlags.ResultDiscarded,
"Test",
null,
typeof(Program),
new CSharpArgumentInfo[]
{
CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
}
)
);
}
SiteContainer0.site1.Target(SiteContainer0.site1, o);
}
更多精彩
赞助商链接