DynamicObject隐式转换

我有一个DynamicObject的子类,我想为原始类型实现隐式转换,就像DO的显式转换方法TryConvert一样; 也就是说,无需编写多个隐式运算符[type]函数。

用法:

dynamic myDynamicObject = new MyDynamicObject("1"); int sum = 1 + myDynamicObject; // instead of int i = 1 + (int)myDynamicObject; 

这是可能的,如果是的话,怎么样?

这里有几件事情。

首先,您正在执行二进制操作。 因此,您还需要覆盖TryBinaryOperation方法。 在转换之前,它将首先被调用。 然后从TryBinaryOperation方法执行转换。

其次,无论出于何种原因,只有在编写如下语句时才调用TryBinaryOperation:

 int sum = myDynamicObject + 1; 

从我现在看来,订单很重要。 我将与DLR团队核实这是一个错误还是预期的行为。

更新:这不是一个错误。 要同时支持“1 + myDynamicObject”和“myDynamicObject + 1”,您不仅需要TryBinaryOperation,还需要TryBinaryOperationFromRight,这是当前DynamicObject根本没有的。

DLR团队回答了我的问题并说当DO是右手操作数时是不可能的。

引用他们的答案:“最重要的规则是动态对象需要是左手操作数,因为动态操作协议只适用于该位置的动态对象。”

左手隐式转换可以通过TryBinaryOperation完成,但为此你还必须实现支持的运算符(+, – ,…)。