为什么对Expression.TypeAs的求值返回的是基础具体类型的对象,而不是我请求它的接口?

西蒙·米德密斯

实际答案在答案注释中。我原本希望获得界面的“实例”,而这是做不到的。

-

我找到了一种方法来做我真正想要的,对于感兴趣的人,我在下面概述了。

public interface Interface<T> { Func<T,T> Property { get; set; } }

public class Concrete : Interface<string>
{
    public Concrete()
    {
        (this as Interface<string>).Property = (s) => { return $"hello, {s}!"; };
    }

    Func<string, string> Interface<string>.Property
    {
        get;
        set;
    }
}

class Program
{
    static void Main(string[] args)
    {
        object obj = new Concrete();

        var propInfo = obj.GetType().GetInterfaces().Single().GetProperty("Property");

        dynamic func = propInfo.GetMethod.Invoke(obj, null);

        var output = func("world");
    }        
}

-

我正在做一些代码生成并大量使用动态类型,但是不幸的是我遇到了动态类型/显式接口的难题。

我可以通过使用此处Convert.ChangeType(...)概述的方法解决此问题,但是它要求IConvertable实现该方法,这会产生我不想做的大量开销。

找到了一个使用Linq表达式使用Expression.TypeAs进行此操作的示例Expression.Convert,但是它总是返回基础的具体类型,而不是我需要的接口。

这是我要执行的代码示例:

namespace ExpressionCasting
{
   public interface Interface<T> { void Method(T t); }

   public class ImplementedInterface : Interface<string> 
   { 
      void Interface<string>.Method(string t) { } 
   }

   class Program 
   { 
      static void Main(string[] args)
      {
          var implementedInterface = new ImplementedInterface();      

          // type is an IInterface<string>
          var type = implementedInterface.GetType().GetInterfaces().Single(); 

          // i is always an ImplementedInterface
          var i = Convert(type, implementedInterface); // i is always an ImplementedInterface

          Console.WriteLine(i.GetType()); // i want this to be an IInterface<string> nit and ImplementedInterface. 
      }

      static object Convert(Type type, object subClass)
      {
         var body = Expression.TypeAs(
            Expression.Constant(subClass, subClass.GetType()), type);

         var run = Expression.Lambda(
            body, Expression.Parameter(subClass.GetType())).Compile();

         return run.DynamicInvoke(subClass);
      }
   }
}

有什么想法可以让我得到所需的表达式吗,或者还有其他我没想到的选择?

迈克·巴里

问题不在于您的表情。它与动态的使用有关。DLR不在考虑显式接口实现。由于以下代码返回相同的异常,因此很容易证明:

dynamic i = new ImplementedInterface();
i.Method(); // throws exception as method is not found.

这是关于此问题的小文章,以及使用动态时的其他惊喜:http : //csharpindepth.com/Articles/Chapter14/DynamicGotchas.aspx

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的代码返回对象的类型而不是它的值?

来自分类Dev

为什么“基础”对象的类型是我的具体类型?

来自分类Dev

为什么 InvocationExpression 的参数是 Expression 而不是 ParameterExpression?

来自分类Dev

C#:为什么我的字符串返回对象类型而不是它包含的值?

来自分类Dev

为什么我们应该使用接口而不是具体类型?

来自分类Java

为什么ObjectOutputStream.readObject()返回Object类型的对象,而不返回我写入它的类型的对象?

来自分类Dev

为什么要使用Expression <Func <T >>而不是Func <T>?

来自分类Dev

为什么此Linq方法接受类型为Expression的参数

来自分类Dev

为什么方法返回接口类型的对象?

来自分类Dev

为什么方法不能声明返回类型`List <IMyInterface>`并返回实现它的具体类

来自分类Dev

为什么在我输入内容之前请求值会立即返回空?

来自分类Dev

为什么我的Dart构造函数返回一个动态而不是类型化的对象?

来自分类Dev

为什么我应该在构造函数中使用对象的接口类型,而不是实际的类对象

来自分类Dev

为什么此类型不是接口?

来自分类Dev

为什么我收到TypeError:undefined不是Angular中的对象(求值”)?

来自分类Dev

为什么不能使用constexpr if(expression),即使表达式也可以在编译时求值

来自分类Dev

为什么它返回的是“ undefined”而不是1

来自分类Dev

为什么我的Ajax请求从wordpress返回空对象?

来自分类Dev

为什么我可以对类型化数组接口使用空值 `[]` 而不是对类型化对象接口使用空值 `{}`?

来自分类Dev

为什么只在我的绘图上显示一部分expression()?

来自分类Dev

为什么我在 JavaScript 中收到 Uncaught Error: Syntax error, unrecognized expression?

来自分类Dev

为什么我会收到错误,例如 Unexpected template string expression no-template-curly-in-string

来自分类Dev

为什么SQL返回数组而不是对象?

来自分类Dev

为什么jQuery返回整数而不是对象?

来自分类Dev

为什么在具体实现中使用Self而不是类型名称?

来自分类Dev

PyQt5:为什么 self.sender() 返回基对象而不是派生对象发送它

来自分类Dev

为什么我的函数的返回类型是 a -> Int

来自分类Javascript

为什么它返回null?

来自分类Dev

为什么在我的帖子请求中得到返回码 200 而不是 201?(Python/请求/Json)

Related 相关文章

  1. 1

    为什么我的代码返回对象的类型而不是它的值?

  2. 2

    为什么“基础”对象的类型是我的具体类型?

  3. 3

    为什么 InvocationExpression 的参数是 Expression 而不是 ParameterExpression?

  4. 4

    C#:为什么我的字符串返回对象类型而不是它包含的值?

  5. 5

    为什么我们应该使用接口而不是具体类型?

  6. 6

    为什么ObjectOutputStream.readObject()返回Object类型的对象,而不返回我写入它的类型的对象?

  7. 7

    为什么要使用Expression <Func <T >>而不是Func <T>?

  8. 8

    为什么此Linq方法接受类型为Expression的参数

  9. 9

    为什么方法返回接口类型的对象?

  10. 10

    为什么方法不能声明返回类型`List <IMyInterface>`并返回实现它的具体类

  11. 11

    为什么在我输入内容之前请求值会立即返回空?

  12. 12

    为什么我的Dart构造函数返回一个动态而不是类型化的对象?

  13. 13

    为什么我应该在构造函数中使用对象的接口类型,而不是实际的类对象

  14. 14

    为什么此类型不是接口?

  15. 15

    为什么我收到TypeError:undefined不是Angular中的对象(求值”)?

  16. 16

    为什么不能使用constexpr if(expression),即使表达式也可以在编译时求值

  17. 17

    为什么它返回的是“ undefined”而不是1

  18. 18

    为什么我的Ajax请求从wordpress返回空对象?

  19. 19

    为什么我可以对类型化数组接口使用空值 `[]` 而不是对类型化对象接口使用空值 `{}`?

  20. 20

    为什么只在我的绘图上显示一部分expression()?

  21. 21

    为什么我在 JavaScript 中收到 Uncaught Error: Syntax error, unrecognized expression?

  22. 22

    为什么我会收到错误,例如 Unexpected template string expression no-template-curly-in-string

  23. 23

    为什么SQL返回数组而不是对象?

  24. 24

    为什么jQuery返回整数而不是对象?

  25. 25

    为什么在具体实现中使用Self而不是类型名称?

  26. 26

    PyQt5:为什么 self.sender() 返回基对象而不是派生对象发送它

  27. 27

    为什么我的函数的返回类型是 a -> Int

  28. 28

    为什么它返回null?

  29. 29

    为什么在我的帖子请求中得到返回码 200 而不是 201?(Python/请求/Json)

热门标签

归档