![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Лен |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 20.1.2009 Репутация: нет Всего: нет |
Нужен метод, выполняющий сложение (либо любую другую элементарную арифметическую операцию), приблизительно такого вида:
Проблема в том, что в качестве и arg1, и arg2 могут выступать:
Как просто выполнить такое сложение, не создавая тьму методов с жёсткой типизацией (с выбором нужного метода в if/switch на 100 строк длиной)? |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 1 Всего: 20 |
Если задачу упростить до того, чтобы возвращаемый тип значение всегда совпадал с типами аргументов, то можно решить с помощью одного шаблонного метода.
-------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| Mephisto |
|
||||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: 2 Всего: 34 |
для шаблонов запрещены операции +, -, * и прочие.
тут правильно написано. |
||||
|
|||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
Не будем категоричны.
|
|||
|
||||
| Лен |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 20.1.2009 Репутация: нет Всего: нет |
Извиняюсь за то, что сразу не уточнил: используется .Net версии 2.0 (т.е. лямбда-выражения и прочие радости жизни недоступны).
Оговорюсь насчёт generic-ов: функция должна быть вида не
Теоретически можно написать всё вот так:
Работать оно будет быстро, но я не имею желания писать копипастом 29^2=841 метод! Должен же быть более элегантный способ. Может, ilasm поможет? |
||||||
|
|||||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
На бейсике напиши
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
||||
|
||||
| Лен |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 20.1.2009 Репутация: нет Всего: нет |
Подскажите, как... Ибо даже не догадываюсь... |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
А что, при использовании отражения приведение типов не нужно что ли? Надо использовать либо метод Type.InvokeMember, либо MethodInfo.Invoke. Операторы компилятся в методы со специальными именами, список здесь http://msdn.microsoft.com/ru-ru/library/ms229032.aspx Проблема только в том, что логику приведения типов тебе в этом случае все равно придется реализовывать самому. А если так, то можно обойтись и без отражения. А вот на счет бейсика это была не шутка. В бейсике такой код работает. Это сообщение отредактировал(а) diadiavova - 12.7.2010, 17:23 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
||||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Ты утверждал, что отражение спасет, а тут главная проблема в том, что для выполнения операции над разнотипными аргументами как правило требуется приведение типов. Так что отражение тут вряд ли может спасти(если, конечно, я правильно понял идею, что не факт). Тут нужна либо ручная реализация логики приведения типов(а это вряд ли получится коротко), либо спасет бейсик Это сообщение отредактировал(а) diadiavova - 12.7.2010, 17:48 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Похоже на реализацию какого-то динамического языка на C#. Создатели таких языков как-то обходятся без N^2 методов для каждого бинарного оператора. Мне кажется, проще всего написать цепочку if, повторяющую логику компилятора. Я бы скукожил численные типы до long, double и decimal, но если уж хочется точно как в C#:
Для остальных арифметических операций правила те же самые, но придётся копипастить. Обобщить, к сожалению, невозможно. Если бы в C# озаботились хоть какой-то явной реализацией numerical tower (interface INumeric<T> или что-то в этом духе), было бы гораздо проще. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
Не - не - не. Я предполагал Приведение хорошо уже тем - что меньше пИсать кода. Твои аргументы убедительны - однако просто приведение приведет к
Хотелось бы конечно красивого решения, но увы, похоже гламур возможен только в Net 3.5 а уж про dynamic из четвертого - это вообще отвал башки. Добавлено через 1 минуту и 16 секунд Void, ужОс. А что делать. Добавлено через 4 минуты и 53 секунды Вообще была мысль создать Hashtable с ключем Type и с келлбеком функции. Но что из этого получится - я не знаю |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Ну я это и имел в виду, когда писал Есть, конечно, лазейки(типа выявления числовых типов итд), но в любом случае это не просто и многа букафф Кстати функция IsNumeric в дотнете есть http://msdn.microsoft.com/ru-ru/library/6c...1(v=VS.90).aspx -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Лен |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 20.1.2009 Репутация: нет Всего: нет |
diadiavova, вариант с Бейсиком пока отложу на полку подальше (но буду иметь в виду), ибо добавлять отдельную dll на бейсике для одного-единственного метода - не комильфо. Попробовал рефлексией (MethodInfo.Invoke) - методы с укзанными в приведенной статье именами через Type.GetMethod(string name) не находятся.
Void, почти угадали - это виртуальная машина для примитивного скриптового C#-подобного языка. Только код в варианте с кучей if-ов (как у Вас) я отверг сразу - реализация 11 методов с 2мя аргументами, каждый из которых может быть одного из 29 типов подобным образом займёт чёртову уйму времени, да и куча копипастов ещё никого до добра не довела. Пока что остановился на компромиссном варианте: с помощью нескольких if-ов отсеиваю тривиальные варианты (строки, даты и т.п.), а с числами буду работать по принципу: "реализовать метод для long/ulong/double" -> "привести оба аргумента к одному из этих типов" -> "вызвать метод". Когда всё получится - выложу код. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |