c# – DLR返回类型

前端之家收集整理的这篇文章主要介绍了c# – DLR返回类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一些DLR帮助.我正在实现一个IDynamicMetaObjectProvider和DynamicMetaObject,但我遇到了一些问题,获得了预期的返回类型.我在Metaobject中覆盖了BindInvokeMember,我可以看到所有的args类型但没有返回类型.有人知道如果可能的话我会怎么做?我知道返回类型是动态的,但如果你调用的东西依赖于返回类型会怎样.除非我知道消费者期望的返回类型,否则我不知道要在DynamicMetaObject中执行哪个操作.

更新二

我不能在这里粘贴我的实际代码,因为它调用各种工作的东西.下面是一些示例动态对象代码.

  1. public class TestDynamicMetaObject : DynamicMetaObject
  2. {
  3. public TestDynamicMetaObject(Expression expression,object value)
  4. : base (expression,BindingRestrictions.Empty,value)
  5. {
  6. }
  7.  
  8. public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder,DynamicMetaObject[] args)
  9. {
  10. Delegate method = new Func<int>(Test);
  11. return new DynamicMetaObject(
  12. Expression.Call(method.Method),BindingRestrictions.GetInstanceRestriction(Expression,Value),Value
  13. );
  14. }
  15.  
  16. public static int Test()
  17. {
  18. return 10;
  19. }
  20.  
  21. }
  22. public class TestDynamicObject : IDynamicMetaObjectProvider
  23. {
  24. DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
  25. {
  26. return new TestDynamicMetaObject(parameter,this);
  27. }
  28. }

这是我正在使用的地方.

  1. static void Main(string[] args)
  2. {
  3. try
  4. {
  5. dynamic x = new TestDynamicObject();
  6. int gg= x.Test();
  7. Console.WriteLine(gg);
  8. }
  9. catch (Exception excep)
  10. {
  11. Console.WriteLine(excep);
  12. }
  13. Console.ReadLine();
  14. }

这是编译器创建的代码.

  1. private static void Main(string[] args)
  2. {
  3. try
  4. {
  5. object x = new TestDynamicObject();
  6. if (<Main>o__SiteContainer0.<>p__Site1 == null)
  7. {
  8. <Main>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite,object,int>>.Create(new CSharpConvertBinder(typeof(int),CSharpConversionKind.ImplicitConversion,false));
  9. }
  10. if (<Main>o__SiteContainer0.<>p__Site2 == null)
  11. {
  12. <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) }));
  13. }
  14. 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)));
  15. }
  16. catch (Exception excep)
  17. {
  18. Console.WriteLine(excep);
  19. }
  20. Console.ReadLine();
  21. }
@H_301_16@

解决方法

对于返回某些内容的标准二进制文件,返回类型几乎总是对象(get,set,operations等等).否则标准绑定(例如DeleteMember)无效.

您还可以从传入绑定器上的ReturnType属性获取运行时的预期返回类型.

@H_301_16@ @H_301_16@

猜你在找的C#相关文章