我需要一些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<int>(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();
- }
这是编译器创建的代码.
@H_301_16@
- private static void Main(string[] args)
- {
- try
- {
- object x = new TestDynamicObject();
- if (<Main>o__SiteContainer0.<>p__Site1 == null)
- {
- <Main>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite,object,int>>.Create(new CSharpConvertBinder(typeof(int),CSharpConversionKind.ImplicitConversion,false));
- }
- if (<Main>o__SiteContainer0.<>p__Site2 == null)
- {
- <Main>o__SiteContainer0.<>p__Site2 = CallSite<Func<CallSite,object>>.Create(new CSharpInvokeMemberBinder(CSharpCallFlags.None,"Test",typeof(Program),null,new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None,null) }));
- }
- Console.WriteLine(<Main>o__SiteContainer0.<>p__Site1.Target(<Main>o__SiteContainer0.<>p__Site1,<Main>o__SiteContainer0.<>p__Site2.Target(<Main>o__SiteContainer0.<>p__Site2,x)));
- }
- catch (Exception excep)
- {
- Console.WriteLine(excep);
- }
- Console.ReadLine();
- }