我有一个DynamicObject的子类,我想实现基本类型的隐式类型转换,类似于DO的显式类型转换方法TryConvert;也就是说,不需要编写多个隐式操作符类型函数。
用法:
dynamic myDynamicObject = new MyDynamicObject("1");
int sum = 1 + myDynamicObject; // instead of int i = 1 + (int)myDynamicObject;这是可能的吗?如果可能,是如何实现的?
发布于 2010-01-19 03:54:09
这里有几件事正在发生。
首先,您正在执行一个二进制操作。因此,您还需要覆盖TryBinaryOperation方法。它将首先被调用,然后再进行转换。然后,您可以从TryBinaryOperation方法执行转换。
其次,无论出于何种原因,只有在编写如下语句时才会调用TryBinaryOperation:
int sum = myDynamicObject + 1;从我现在看来,顺序很重要。我将与DLR团队确认这是bug还是有意为之的行为。
更新:这不是一个bug。要同时支持"1 + myDynamicObject“和"myDynamicObject + 1”,您不仅需要TryBinaryOperation,还需要像TryBinaryOperationFromRight这样的东西,而当前的DynamicObject根本不具备这些东西。
发布于 2010-01-21 05:29:42
DLR-team回答了我的问题,说当DO是右边的操作数时,这是不可能的。
引用自他们的回答:“最重要的规则是,动态对象必须是左操作数,因为动态操作协议只适用于该位置的动态对象。”
左侧的隐式类型转换可以通过TryBinaryOperation完成,但为此,您还必须实现受支持的运算符(+,-,...)。
https://stackoverflow.com/questions/2075649
复制相似问题