【问题标题】:DynamicObject implicit castingDynamicObject 隐式转换
【发布时间】:2016-08-24 12:47:20
【问题描述】:

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

用法:

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

这可能吗?如果可以,怎么做?

【问题讨论】:

    标签: c# .net dynamic casting dynamic-language-runtime


    【解决方案1】:

    这里发生了几件事。

    首先,您正在执行二元运算。因此,您还需要覆盖 TryBinaryOperation 方法。它将在转换之前首先被调用。然后可以从 TryBinaryOperation 方法执行转换。

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

    int sum = myDynamicObject + 1;
    

    从我现在看到的情况来看,顺序很重要。我将与 DLR 团队核实这是错误还是预期行为。

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

    【讨论】:

    • 在“1+myDynamicObject”场景中使用隐式转换,它使用转换类型的左侧操作;在这种情况下,整数运算 +(int,int)。但是,是的,TryBinaryOperation 仅支持左侧操作。这就是为什么与显式转换的 TryConvert 类似的隐式转换方法非常有用的原因。
    • TryConvert 实际上支持隐式和显式转换。例如,这很好用:“int sum = myDynamicObject;”如果您覆盖 TryConvert。但是当您执行二进制操作(我猜也是一元操作)时,不会调用 TryConvert 方法。我建议你写信给 dlr@microsoft.com 并在那里解释你的用例。这可能是一个错误,或者这背后可能有一些设计合理性,团队可以比我更好地解释。
    【解决方案2】:

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

    引自他们的回答: “最重要的规则是动态对象必须是左侧操作数,因为动态操作协议仅适用于该位置的动态对象。”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 2015-07-06
      • 1970-01-01
      相关资源
      最近更新 更多