调用IDynamicMetaObjectProvider的成员而不引用Microsoft.CSharp.dll

时间:2010-09-01 07:45:12

标签: c# .net dynamic .net-4.0 c#-4.0

我有一个动态值(IDynamicMetaObjectProvider的实现),我想调用方法和属性。

到目前为止,我发现在动态值上调用成员的示例使用Microsoft.CSharp.dll中的类型,例如

IDynamicMetaObjectProvider x = GetDynamicValue();
CallSite<Func<CallSite, object, object, object>> site = CallSite<Func<CallSite, object, object, object>>.Create(
            Binder.SetMember(
                Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags.None,
                "Foo",
                null,
                new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }
            )
        );
site.Target(site, x, 42);

我希望能够在不使用Microsoft.CSharp.dll的情况下调用IDynamicMetaObjectProvider的成员。请注意,我不是在与C#相关的任何内容上使用C#动态关键字,而是直接使用IDynamicMetaObjectProvider。

另请注意,使用Reflection无效。反射绕过动态调用绑定,只是对底层类型执行Reflection。我需要一种适用于IDynamicMetaObjectProvider的任何实现的技术。

1 个答案:

答案 0 :(得分:3)

您必须实现自己的CallSiteBinder,因为没有与语言无关的CallSiteBinders。基本上,这个想法是Binder处理从调用语言提供的信息之间的细微差别,以选择正确的成员绑定到任何对象,无论语言如何。

由于它不像CSharp Binder无法绑定到IronPython对象,因此根据库消费者语言使用不同绑定器的灵活性取决于您通过库提供的灵活性。鉴于以上示例,如果您不允许库消费者更改任何活页夹参数,那么您可以使用CSharp Binder,如果您提供更多可能通过依赖注入或重载方法提供切换绑定器将是有用的

但是,我认为如果你想传递一些绑定参数,CSharpBinder应该没问题,因为csharp绑定器为你提供了非常好的灵活性绑定(除了不打算更改绑定之外)不区分大小写),它确实是通用库中绑定器的最佳选择,因为它是.net 4.0安装和Mono 2.8安装中唯一标准语言绑定器。