Вывод типа результата по выражению
От: Andy77 Ниоткуда  
Дата: 08.07.09 17:57
Оценка:
Хочется добавить поддержку формул в наше spreadsheet-based приложение, как бы это поэлегантнее и с наименьшими усилиями сделать? Известны имена колонок и их типы, например:

owner — string
row — int64
col — int64
volume — double

В идеале, пользователи будут писать выражения наподобие лямбд, приложение же дожно их правильно вычислять. Вот примеры выражений:

volume * conc // double
owner != null && row > 5 && col < 3 // bool
owner != null && row > 5 && col < 3 ? "foo" : "bar"  // string
// int
{
   if (volume == null) return 4;
   return 3;
}


Если бы тип возвращаемого результата был заранее известен, то проблема решалась бы очень просто генерацией и компиляцией следущего кода:

public static Func<string, Int64, Int64, double, double> calc = (owner, row, col, volume) => volume * row;
public static Func<string, Int64, Int64, double, int> calc = (owner, row, col, volume) => 
{
   if (volume == null) return 4;
   return 3;
};
etc.


С этим мы бы еще могли жить, пробуя компилировать сгенерированный код со всеми типами результатов, которые поддерживаются нашим приложением (к счастью, их всего пара десятков), но нам всё равно придётся убирать параметры-колонки, не участвующие в выражении, по соображениям производительности (накладно доставать все данные, кол-во колонок может достигать десятков тысяч), так что я начинаю задумыватся о предварительном парсинге выражения... хотя, возможно, будет проще анализировать скомпилированный код рефлекшоном и потом компилировать выражение второй раз, убрав неиспользуемые параметры.

Есть ли какие-то другие идеи? Задача выглядит довольно общей, и я уверен, что кто-то уже сталкивался с ней ранее.

P.S. FW 3.5
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.