C# 4.0、动态关键字与 COM
2010-09-30 22:44:44 来源:WEB开发网图 2 中的代码已经过编辑和简化以方便阅读,但它显示了实际情况的要点。动态变量映射到 System.Object 实例,然后就会在 DLR 中为程序创建一个站点。该站点负责管理 WriteLine 方法及其参数与目标对象之间的绑定。该绑定维持在类型 Program 的上下文中。为了对动态变量调用方法 Console.WriteLine,您将调用该站点,并传递目标对象(本例中为 Console 类型)及其参数(本例中为动态变量)。该站点将在内部检查目标对象是否真的拥有成员 WriteLine,并且该成员能够接受类似于变量 x 中目前存储的对象这样的参数。如果有任何问题,C# 运行时就会引发 RuntimeBinderException。
图 2 动态变量的真正实现
internal class Program
{
private static void Main(string[] args)
{
object x = 1;
if (MainSiteContainer.site1 == null)
{
MainSiteContainer.site1 = CallSite<
Action<CallSite, Type, object>>
.Create(Binder.InvokeMember(
"WriteLine",
null,
typeof(Program),
new CSharpArgumentInfo[] {
CSharpArgumentInfo.Create(...)
}));
}
MainSiteContainer.site1.Target.Invoke(
site1, typeof(Console), x);
}
private static class MainSiteContainer
{
public static CallSite<Action<CallSite, Type, object>> site1;
}
}
更多精彩
赞助商链接