Вызов операторов
От: krasin Россия  
Дата: 18.03.04 11:06
Оценка:
Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.

object Add(object left, object right)
{
}


Как?
Re: Вызов операторов
От: SiAVoL Россия  
Дата: 18.03.04 11:20
Оценка:
Здравствуйте, krasin, Вы писали:

K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.


K>
K>object Add(object left, object right)
K>{
K>}
K>


K>Как?

см Type.InvokeMember
ЗЫ: может его все же в интерфейс засунуть?
... << RSDN@Home 1.1.3 stable >>
Re: Вызов операторов
От: Sulik Россия http://nickpasko.blogspot.com
Дата: 18.03.04 11:21
Оценка:
Здравствуйте, krasin, Вы писали:

K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.


K>
K>object Add(object left, object right)
K>{
K>}
K>


K>Как?


Из этого описания ничего не понятно. Распиши подробнее, что тебе нужно и в чем проблема.
Сознание определяет бытие!
Re: Вызов операторов
От: Par-zzz  
Дата: 18.03.04 11:39
Оценка:
Здравствуйте, krasin, Вы писали:

K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.


K>
K>object Add(object left, object right)
K>{
K>}
K>


K>Как?


Юзай интерфейсы

IAddend Add(IAddend left, IAddend right)
{
}


сложнее если это не твои объекты.
/**
* у человека столько проблем, сколько он их себе создает
*/
Re: Вызов операторов
От: hugo Австрия  
Дата: 18.03.04 11:39
Оценка: -1
Здравствуйте, krasin, Вы писали:

K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.


K>
K>object Add(object left, object right)
K>{
K>}
K>


K>Как?


object Add(object left, object right)
{
Type type = left.GetType();
MethodInfo mi = type.GetMethod("op_Addition");
return mi.Invoke(left, new object[]{left, right});
}


так покатит?
Re[2]: Вызов операторов
От: Аноним  
Дата: 18.03.04 12:59
Оценка:
Здравствуйте, Sulik, Вы писали:

S>Из этого описания ничего не понятно. Распиши подробнее, что тебе нужно и в чем проблема.


Я пишу интерпретатор, соответственно, приходится реализовывать арифметические операции над переменными языка. Т.к. язык нетипизирован, нельзя предсказать, что попадет на вход того же оператора сложения (int/float/string etc). Поэтому приходится писать код вроде


if (left is int && right is int)
   return ( (int)left + (int)right );
if (left is float && right is float)
   return ( (float)left + (float)right );
...
throw new Exception("Unknown types");


Была идея сделать на уровне MSIL, но там для встроенных типов вызывается команда add, а для пользовательских классов call <Имя типа>.op_Addition
То есть единого способа вызвать сложение нет.
Дальше — хуже.
Пробуем сложить, например int и long:

int a  = 3;
long b = 4;
long result = a + b;


L_0050: ldc.i4.3 
L_0051: stloc.s V_5
L_0053: ldc.i4.5 
L_0054: conv.i8 
L_0055: stloc.s V_6
L_0057: ldloc.s V_5

L_0059: conv.i8 

L_005a: ldloc.s V_6
L_005c: add 
L_005d: stloc.s V_7

То есть компилятор автоматически приводит к long, однако, если тип известен только во времени исполнения мы не знаем к чему приводить. Даже если все целые типы приводить к long , все равно как только возникает float все становится плохо.

Другими словами, проблема решаема но большим количеством if. А как короче я не знаю
Re: Вызов операторов
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.03.04 14:52
Оценка:
Здравствуйте, krasin, Вы писали:

K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.


Ищи рефлекшеном методы с префиксом op_ и флагом IsSpecialName
... << RSDN@Home 1.1.3 stable >>
AVK Blog
Re[2]: Вызов операторов
От: krasin Россия  
Дата: 18.03.04 15:26
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, krasin, Вы писали:


K>>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.


AVK>Ищи рефлекшеном методы с префиксом op_ и флагом IsSpecialName


Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.