C# 为什么Expression.TypeAs的求值返回的是底层具体类型的对象,而不是接口I';我要求的?

C# 为什么Expression.TypeAs的求值返回的是底层具体类型的对象,而不是接口I';我要求的?,c#,reflection,expression-trees,C#,Reflection,Expression Trees,实际答案在对答案的评论中。我希望得到我的接口的“实例”,但这是你做不到的 -- 我找到了一种方法去做我真正想做的事情,对于任何感兴趣的人,我已经在下面概述了 你知道如何通过表达式获得所需的信息吗?或者如果我没有想到另一个选项?你正在返回一个对象并将其推入一个动态参数。它将使用尽可能最简单的强制转换,它是在接口而不是接口中实现的。通过向下转换为type对象,然后作为动态变量调用,实际上是在撤消Convert方法中完成的转换。问题不在于表达式。这是与动态的使用。DLR没有考虑显式接口实现。很容易证明

实际答案在对答案的评论中。我希望得到我的接口的“实例”,但这是你做不到的

--

我找到了一种方法去做我真正想做的事情,对于任何感兴趣的人,我已经在下面概述了


你知道如何通过表达式获得所需的信息吗?或者如果我没有想到另一个选项?

你正在返回一个对象并将其推入一个动态参数。它将使用尽可能最简单的强制转换,它是在接口而不是接口中实现的。通过向下转换为type对象,然后作为动态变量调用,实际上是在撤消Convert方法中完成的转换。

问题不在于表达式。这是与动态的使用。DLR没有考虑显式接口实现。很容易证明,因为以下代码返回相同的异常:

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

下面是一篇关于这个问题的小文章,以及使用dynamic时的其他惊喜:

您的表情看起来不错。 但是
动态
本身存在一个问题

即使在这种情况下(见下文),也会出现错误:

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

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

void Main()
{
    dynamic i = (Interface<string>)new ImplementedInterface();

    i.Method(); // throws exception as method is not found.
}
公共接口{void方法(T);}
实现的公共类接口:接口{void Interface.Method(字符串t){}
void Main()
{
动态i=(接口)新实现的接口();
i、 Method();//由于找不到方法而引发异常。
}

您的期望不是很清楚-为什么获取实现接口的类实例是一个问题?您还希望得到什么结果-接口没有实例。。。也作为Mike
i.Method()总是抛出,因为这个方法不在接口中-确保您的示例实际显示了问题。我想您的意思是
I.method(“foo”)但这实际上并没有改变这里的问题。即使使用
ImpromptuInterface
,这是将动态对象转换为接口的一个很好的工具,您仍然无法访问这样的显式实现。顺便说一句,您的转换方法是创建一个不使用参数的lambda体,然后用参数调用它。创建一个参数并将其作为TypeAs的第一个参数而不是常量值传递,或者继续使用constant并去掉lambda参数和传递给DynamicInvoke的参数。(不会改变问题,只是清理使用)。回答得好,如果正确,这意味着问题与标题中的问题无关,很可能会以“排版错误”结束…@mike这就是我的意思“不幸的是,我遇到了动态类型/显式接口难题”。您基本上是在寻找调用私有方法。IE:使用对MethodInfo:GetMethod(“Interface.Method”,BindingFlags.Instance | BindingFlags.NonPublic)的反射。您需要实现自己的DynamicObject来实现这一点。现在,这个问题变得不那么有意义了。实例上的GetType()永远不会返回接口,因为接口永远无法实例化。要记住的是调用显式接口是编译器的函数,而不是运行时的函数。
dynamic i = new ImplementedInterface();
i.Method(); // throws exception as method is not found.
public interface Interface<T> { void Method(T t); }

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

void Main()
{
    dynamic i = (Interface<string>)new ImplementedInterface();

    i.Method(); // throws exception as method is not found.
}