Неявное приведение DynamicObject

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

Применение:

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

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


person Toni Kielo    schedule 16.01.2010    source источник


Ответы (2)


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

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

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

int sum = myDynamicObject + 1;

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

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

person Alexandra Rusina    schedule 18.01.2010
comment
При неявном приведении в сценарии 1+myDynamicObject используется левосторонняя операция над типом приведения; в этом случае операция ints +(int,int). Но да, TryBinaryOperation поддерживает только левосторонние операции. Вот почему такой же метод неявного приведения, как TryConvert для явного приведения, был бы очень полезен. - person Toni Kielo; 19.01.2010
comment
Фактически TryConvert поддерживает как неявное, так и явное приведение типов. Например, это прекрасно работает: int sum = myDynamicObject; если вы переопределите TryConvert. Но когда вы выполняете бинарную операцию (и, я думаю, и унарную), метод TryConvert не вызывается. Я предлагаю вам написать по адресу [email protected] и объяснить свой вариант использования. Это может быть ошибка или за этим может стоять какой-то рациональный дизайн, который команда может объяснить лучше, чем я. - person Alexandra Rusina; 19.01.2010

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

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

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

person Toni Kielo    schedule 20.01.2010