2010-01-16 6 views
5

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

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

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

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

ответ

5

Здесь есть несколько вещей.

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

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

int sum = myDynamicObject + 1; 

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

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

+0

С неявным литьем в сценарии «1 + myDynamicObject» он использует операцию с левыми сторонами в литом типе; в этом случае ints operation + (int, int). Но да, TryBinaryOperation поддерживает только левые операции. Вот почему подобный метод неявного литья как TryConvert для явного литья был бы очень полезен. –

+0

TryConvert фактически поддерживает как неявное, так и явное литье. Например, это прекрасно работает: «int sum = myDynamicObject;» если вы переопределите TryConvert. Но когда вы выполняете двоичную операцию (и я думаю, унарные тоже), метод TryConvert не вызывается. Я предлагаю вам написать на [email protected] и объяснить вам пример использования. Это может быть ошибка, или за этим может быть разумный дизайн, который команда может объяснить лучше меня. –

3

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

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

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