我试图通过搜索找到答案,但最终决定用新的问题来代替。
我正致力于将XML序列化成动态类型,我做了所有事情,但现在我希望能够以类似于反射的方式访问成员。
在继承自DynamicObject的类型中,我实现了TryGetMemeber和TryGetIndex方法,以便使用这种方式访问值。
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];但是,我希望通过运行时编译器服务访问相同的成员。
要获得成员,我使用以下代码:
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**?**可以帮助我并解释如何使用访问索引器--任何代码示例都将不胜感激!
发布于 2013-10-02 22:08:21
为了正确地调用塔吉特,您需要在CSharpArgumentInfo调用中再添加一个Binder.GetIndex参数。否则,它将在ArgumentOutOfRangeException中失败。
下面是一个有用的例子:
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 indexhttps://stackoverflow.com/questions/19121972
复制相似问题