首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Binder.GetIndex

如何使用Binder.GetIndex
EN

Stack Overflow用户
提问于 2013-10-01 17:04:05
回答 1查看 238关注 0票数 0

我试图通过搜索找到答案,但最终决定用新的问题来代替。

我正致力于将XML序列化成动态类型,我做了所有事情,但现在我希望能够以类似于反射的方式访问成员。

在继承自DynamicObject的类型中,我实现了TryGetMemeberTryGetIndex方法,以便使用这种方式访问值。

代码语言:javascript
复制
XmlTextReader xmlReader = new XmlTextReader(memStr);
DynamicXMLObjectConverter converter = new DynamicXMLObjectConverter();
dynamic obj = converter.Deserialize(xmlReader, typeof(DynamicXMLObject));

string str = obj.dynamic_property;
string item = obj[0];

但是,我希望通过运行时编译器服务访问相同的成员。

要获得成员,我使用以下代码:

代码语言:javascript
复制
CallSiteBinder binder = Binder.GetMember(CSharpBinderFlags.None, "dynamic_property", typeof(MyDynamic), new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) });
CallSite<Func<CallSite, object, object>> callsite = CallSite<Func<CallSite, object, object>>.Create(binder);
var obj = callsite.Target(callsite, source);

它可以工作,我可以访问任何动态类型的成员。对我来说,下一件事就是用同样的方式访问索引器。我知道Binder支持GetIndex方法,所以在技术上它应该以与GetMember相同的方式工作,但它不支持。

callsite**?**可以帮助我并解释如何使用访问索引器--任何代码示例都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-02 22:08:21

为了正确地调用塔吉特,您需要在CSharpArgumentInfo调用中再添加一个Binder.GetIndex参数。否则,它将在ArgumentOutOfRangeException中失败。

下面是一个有用的例子:

代码语言:javascript
复制
var binder = Binder.GetIndex(CSharpBinderFlags.None, typeof (SampleDynamicObject), new[]
{
    CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
    CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null) // this argument is required!
});
var callsite = CallSite<Func<CallSite, object, object, object>>.Create(binder);
var obj = callsite.Target(callsite, sampleObject, 0); // 0 is an index
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19121972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档