11

是否可以确定动态成员访问期望的类型?我试过了

dynamic foo = new MyDynamicObject();
int x = foo.IntValue;
int y = (int)foo.IntValue;

无论哪种方式,TryGetMember拦截GetMemberBinder.ReturnType都是对象。我还实现TryConvert了想知道它是否会被调用来进行转换,但它永远不会被命中。

是否还有其他一些我遗漏的覆盖可以让我确定调用者想要什么类型,以便我可以进行适当的转换?

4

1 回答 1

10

在 C# 中,当使用动态时,编译器总是将绑定器设置为对象的返回类型,然后进行第二次动态隐式转换为预期的返回类型。因此,在从 c# 调用的 DynamicObject 上,GetMemberBinder.ReturnType 将始终是对象,但这表示如果您返回另一种实现 TryConvert 的跳板动态对象,您可以获得该类型,除非用户var or dynamic将其作为变量,那么他们有在静态类型化之前不会做任何事情的代理。

ImpromptuInterface做了一些不同的事情,但是沿着这些思路,因为它还希望有一个基于返回类型而变化的动态实现——只是你必须通过一个接口来描述动态对象。

于 2011-08-12T21:54:30.903 回答