Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102

Распарсить строку в разные nullable типы — Decimal И DateTime — в одном операторе

15.05.2014, 13:50. Показов 1646. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый.
Возникла необходимость парсить строку в разные nullable типы - Decimal? и DateTime? - в одном операторе. Для этого я сделал обобщённый класс (ну чтобы не писать свой парсинг для каждого из типов), вот такой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
class Nullables<T>
    where T: new() {
        public static T Parse(string arg) {
        dynamic obj = new T();
        if (arg == string.Empty) {
            return default(T);
        }
        else {
            return obj.Parse(arg);
        }
    }
}
и парсю так:
C#
1
2
Date_start = Nullables<DateTime?>.Parse(splittedLine[5]);
Penya = Nullables<Decimal?>.Parse(splittedLine[11]);
Это всё работает, но не нравится, что статический метод Parse приходится вызывать на экземпляре класса. Пытался приблудить како-нибудь интерфейс IParsable, но мозгов не хватает понять, как его потом унаследовать уже существующими классами Decimal и DateTime.
Буду благодарен за указание на то, как такую задачу можно решить покрасивее.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2014, 13:50
Ответы с готовыми решениями:

Разные типы данных в одном поле
Предположим, что мне нужно хранить информацию о человеке в одной таблице. Таблица из двух колонок: характеристика и ее значение. ...

Разные типы денежных данных в одном поле
Помогите, плиз, не могу сам разобраться. Полазил по инету и не нашел ответа. Есть база с учетом поступлений от разных людей и каждый дает...

Не отображаются разные типы диаграмм на одном графике
Здравствуйте. Собственно, проблему описала уже в заголовке темы. Мне необходимо, чтобы одна зависимость изображалась точками, вторая -...

10
1168 / 886 / 517
Регистрация: 09.04.2014
Сообщений: 2,102
15.05.2014, 14:37
Цитата Сообщение от vJRoF Посмотреть сообщение
статический метод Parse приходится вызывать на экземпляре класса
Цитата Сообщение от vJRoF Посмотреть сообщение
Date_start = Nullables<DateTime?>.Parse(splittedLine[5]);
где тут экземпляр класса?

можна сделать немножко иначе, но это ничего нового не вносит
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Nullables
    {
        public static T Parse<T>(string arg) where T:new()
        {
            dynamic obj = new T();
            if (arg == string.Empty)
            {
                return default(T);
            }
            else
            {
                return obj.Parse(arg);
            }
        }
    }
C#
1
Date_start = Nullables.Parse<DateTime?>(splittedLine[5]);
0
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
15.05.2014, 14:39  [ТС]
Цитата Сообщение от nedel Посмотреть сообщение
где тут экземпляр класса?
Экземпляр класса здесь dynamic obj = new T();
Именно на нём вызывается Parse.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
15.05.2014, 14:45
vJRoF, сам смысл использования метода Parse() требует экземпляра класса - что вы будете парсить с самого класса? Ведь именно в экземпляре содержится информация, которую вы хотите получить.
По поводу кода, почему выбрали dynamic?
C#
1
dynamic obj = new T();
Тип объекта будет известен уже на этапе компиляции, так что
C#
1
T obj = new T();
1
1168 / 886 / 517
Регистрация: 09.04.2014
Сообщений: 2,102
15.05.2014, 14:47
по мне уж лучше так, чем через Reflection

Добавлено через 1 минуту
Цитата Сообщение от tezaurismosis Посмотреть сообщение
почему выбрали dynamic?
компилятор не проверяет есть ли у dynamic метод Parse
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
15.05.2014, 14:52
Лучший ответ Сообщение было отмечено vJRoF как решение

Решение

Вообще, если речь идёт о типе Nullable<T>, то наиболее грамотно будет как-нибудь так поступить:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public static class Parsers
    {
        public static Nullable<T> Parse<T>(this string input) 
            where T : struct
        {
            if (string.IsNullOrEmpty(input))
                return null;
            try
            {
                return new Nullable<T>((T)Convert.ChangeType(input, typeof(T)));
            }
            catch
            {
                return null;
            }
        }
    }
Применение:
C#
1
int? intValue = "25".Parse<int>(); //25
Добавлено через 1 минуту
Цитата Сообщение от nedel Посмотреть сообщение
компилятор не проверяет есть ли у dynamic метод Parse
метода Parse на том, что можно положить в Nullable, а это структуры, и нету.

Reflection в разы лучше dynamic в данном случае.
1
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
15.05.2014, 15:10  [ТС]
tezaurismosis, с dynamic'ом я поспешил, конечно. Можно и строгой типизацией обойтись.
А экземпляром я в данном случае называю именно obj, а не аргумент функции Parse arg. То, что аргумент должен быть, я сомнению не подвергаю)
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
15.05.2014, 15:12
vJRoF, ну собственно obj Вам там и не нужен, метода Parse на нём всё равно нет
0
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
15.05.2014, 15:14  [ТС]
Spawn, да, я вижу. Не совсем то, что я имел ввиду, но точно красивее чем то, что я наколупал.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
15.05.2014, 15:25
vJRoF, а в чём не то?

Добавлено через 16 секунд
Красиво, да
0
13 / 13 / 8
Регистрация: 11.10.2013
Сообщений: 102
15.05.2014, 16:11  [ТС]
Spawn, Я сначала думал, что нужно как-то расширить существующие классы Decimal и DateTime таким методом, который возвращал бы Nullable. Ну и соответственно обобщить их как-то, чтобы для каждого отдельную реализацию не писать. Как это сделать я не знал.
А вот зайти совсем с другой стороны и расширить string необходимым обобщённым методом - это как раз то, что я назвал "Не совсем то, что я имел ввиду"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.05.2014, 16:11
Помогаю со студенческими работами здесь

Как сделать разные типы возвращаемых значений в одном методе
как сделать разные типы возвращаемых значений в одном методе? public static DateTime Metod(){...} public static Double Metod(){...}...

Nullable - типы и ввод через user-а
Доброго здоровья вам. Такой вопрос, есть код. В мейне если параметр Quantity сделать null то в функции Human пройдет проверка что параметр...

Операнды имеют неприводимые типы (в операторе if)
uses crt; var a,b,d:integer; k:string; begin; randomize; repeat clrscr; a:=random(50); if a=1 then begin

Как из одной строки datetime вычесть другую строку datetime?
Добрый день Как сделать запрос чтобы получить разницу времени между строчками() для всех значений в отдельный столбец? я понять не могу

Типы данных text и varchar в операторе equal to несовместимы
Здравствуйте. Собственно сабж. при обращении выдает &quot;Типы данных text и varchar в операторе equal to несовместимы&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru