DynamicObject неявное приведение - PullRequest
5 голосов
/ 16 января 2010

У меня есть подкласс DynamicObject, и я хотел бы реализовать неявное приведение типов примитивов так же, как явный метод преобразования DO TryConvert; то есть без написания нескольких неявных функций оператора [тип].

Использование:

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

Возможно ли это, и если да, то как?

Ответы [ 2 ]

6 голосов
/ 18 января 2010

Здесь происходит несколько вещей.

Сначала вы выполняете двоичную операцию. Итак, вам также необходимо переопределить метод TryBinaryOperation . Он будет вызван первым, до преобразования. Затем из метода TryBinaryOperation вы можете выполнить преобразование.

Во-вторых, по какой-либо причине TryBinaryOperation вызывается только в том случае, если вы напишите оператор, подобный этому:

int sum = myDynamicObject + 1;

Из того, что я вижу сейчас, порядок важен. Я проверю с командой DLR, является ли это ошибкой или предполагаемым поведением.

Обновление: Это не ошибка. Для поддержки «1 + myDynamicObject» и «myDynamicObject + 1» вам нужен не только TryBinaryOperation, но и что-то вроде TryBinaryOperationFromRight, которого у текущего DynamicObject просто нет.

3 голосов
/ 21 января 2010

Команда DLR ответила на мой вопрос и сказала, что это невозможно, когда DO является правым операндом.

Цитируется по их ответу: «Главное правило - динамический объект должен быть левым операндом, поскольку протокол динамических операций работает только с динамическим объектом в этой позиции».

Левое неявное приведение может быть выполнено через TryBinaryOperation, но для этого вам также необходимо реализовать поддерживаемые операторы (+, -, ...).

...