我有一个 DynamicObject 的子类,我想为原始类型实现隐式转换,类似于 DO 的显式转换方法 TryConvert;也就是说,无需编写多个隐式运算符 [type] 函数。
用法:
dynamic myDynamicObject = new MyDynamicObject("1");
int sum = 1 + myDynamicObject; // instead of int i = 1 + (int)myDynamicObject;
这可能吗?如果可以,怎么做?
我有一个 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,还需要当前 DynamicObject 根本没有的 TryBinaryOperationFromRight 之类的东西。
DLR 团队回答了我的问题并说当 DO 是右手操作数时这是不可能的。
从他们的回答中引用:“最重要的规则是动态对象需要是左手操作数,因为动态操作协议仅适用于该位置的动态对象。”
左侧隐式转换可以通过 TryBinaryOperation 完成,但为此您还必须实现支持的运算符(+、-、...)。