我需要一些DLR帮助.我正在实现一个IDynamicMetaObjectProvider和DynamicMetaObject,但我遇到了一些问题,获得了预期的返回类型.我在metaobject中覆盖了BindInvokeMember,我可以看到所有的args类型但没有返回类型.有人知道如果可能的话我会怎么做?我知道返回类型是动态的,但是如果你调用的东西依赖于返回类型.除非我知道消费者期望的返回类型,否则我不知道要在DynamicMetaObject中执行哪个操作.
我不能在这里粘贴我的实际代码,因为它调用各种工作的东西.下面是一些示例动态对象代码.
public class TestDynamicMetaObject : DynamicMetaObject { public TestDynamicMetaObject(Expression expression, object value) : base (expression, BindingRestrictions.Empty, value) { } public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { Delegate method = new Func(Test); return new DynamicMetaObject( Expression.Call(method.Method), BindingRestrictions.GetInstanceRestriction(Expression,Value), Value ); } public static int Test() { return 10; } } public class TestDynamicObject : IDynamicMetaObjectProvider { DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) { return new TestDynamicMetaObject(parameter, this); } }
这是我正在使用的地方.
static void Main(string[] args) { try { dynamic x = new TestDynamicObject(); int gg= x.Test(); Console.WriteLine(gg); } catch (Exception excep) { Console.WriteLine(excep); } Console.ReadLine(); }
这是编译器创建的代码.
private static void Main(string[] args) { try { object x = new TestDynamicObject(); if (o__SiteContainer0.<>p__Site1 == null) { o__SiteContainer0.<>p__Site1 = CallSite >.Create(new CSharpConvertBinder(typeof(int), CSharpConversionKind.ImplicitConversion, false)); } if ( o__SiteContainer0.<>p__Site2 == null) { o__SiteContainer0.<>p__Site2 = CallSite >.Create(new CSharpInvokeMemberBinder(CSharpCallFlags.None, "Test", typeof(Program), null, new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) })); } Console.WriteLine( o__SiteContainer0.<>p__Site1.Target( o__SiteContainer0.<>p__Site1, o__SiteContainer0.<>p__Site2.Target( o__SiteContainer0.<>p__Site2, x))); } catch (Exception excep) { Console.WriteLine(excep); } Console.ReadLine(); }
Dino Viehlan.. 5
对于返回某些内容的标准二进制文件,返回类型几乎总是对象(get,set,operations等等).否则标准绑定(例如DeleteMember)无效.
您还可以从传入绑定器上的ReturnType属性获取运行时的预期返回类型.
对于返回某些内容的标准二进制文件,返回类型几乎总是对象(get,set,operations等等).否则标准绑定(例如DeleteMember)无效.
您还可以从传入绑定器上的ReturnType属性获取运行时的预期返回类型.