Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.
object Add(object left, object right)
{
}
Как?
Здравствуйте, krasin, Вы писали:
K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.
K>K>object Add(object left, object right)
K>{
K>}
K>
K>Как?
см Type.InvokeMember
ЗЫ: может его все же в интерфейс засунуть?
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, krasin, Вы писали:
K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.
K>K>object Add(object left, object right)
K>{
K>}
K>
K>Как?
Из этого описания ничего не понятно. Распиши подробнее, что тебе нужно и в чем проблема.
Здравствуйте, krasin, Вы писали:
K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.
K>K>object Add(object left, object right)
K>{
K>}
K>
K>Как?
Юзай интерфейсы
IAddend Add(IAddend left, IAddend right)
{
}
сложнее если это не твои объекты.
Здравствуйте, 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});
}
так покатит?
Здравствуйте, 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. А как короче я не знаю
Здравствуйте, krasin, Вы писали:
K>Надо вызвать оператор для объектов тип которых во время компиляции неизвестен.
Ищи рефлекшеном методы с префиксом op_ и флагом IsSpecialName
... << RSDN@Home 1.1.3 stable >>