Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой? / 10 сообщений из 10, страница 1 из 1
23.07.2013, 21:01
    #38341304
LINQStudent
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
Подскажите.

Мне необходимо из строки, создавать объекты разных базовых типов (int, DateTime и прочие).


Использую для этого метод Convert.ChangeType

return Convert.ChangeType(StringToConvert, TypeConvertTo);

Функция возвращает тип Object. Но под этим object'ом скрываются строго типизированные значения. Далее в приложении идет нормальная работа с полученными данными, в соответствии с их конкретным типомтипом.


Проблема.
Мне необходимо обрабатывать ситуацию, когда в строке будет пустота. Это нормальная ситуация. Мне нужно лишь вернуть default().

Но дефаулт работает только с генериками. А у меня нет генериков.

Подскажите выход.

Понимаю, что можно вручную написать switch и вручную все закодировать: если int, вернуть 0 и т.д.

Но наверняка уже есть велосипед для этого. Подскажите пожалуйста код велосипеда.
...
Рейтинг: 0 / 0
23.07.2013, 21:12
    #38341313
LINQStudent
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
StringToConvert имеет тип object

Т.е
object StringToConvert = GetValueInString;
...
Convert.ChangeType(StringToConvert, TypeConvertTo)
...
Рейтинг: 0 / 0
23.07.2013, 21:15
    #38341320
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
Код возможно будет, как только вы напишете сигнатуру метода... того что return Convert.ChangeType(StringToConvert, TypeConvertTo)
И объясните что за беда с генериками и как он (метод) будет использоваться...
...
Рейтинг: 0 / 0
23.07.2013, 21:22
    #38341331
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
LINQStudent,
можно обложить вашу идею дженериками.
сделать расширение для string
Код: c#
1.
2.
3.
4.
5.
 
      public static Object MyChangeTypeForString<T>(this string str)
        {
            return str == null ? default( T) : Convert.ChangeType(str, typeof (T));
        }
...
Рейтинг: 0 / 0
23.07.2013, 21:26
    #38341337
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
How to make a Generic Type Cast function
ну и добавить проверку... ежли валуе тайп - тоды default()...
...
Рейтинг: 0 / 0
23.07.2013, 21:39
    #38341357
LINQStudent
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
       
        private static object GetObject(XElement elem)
        {
            object ObjToConvert = elem.Value;
            Type TypeConvertTo = ParseType_OfField(elem); // в атрибуте указан тип. Например "int"

            return Convert.ChangeType(ObjToConvert, TypeConvertTo);
        }


              // Создание расписания из XMLки
              XElement ShedIdElem;
              XElement ShedNameElem;
              int ShedId = (int)GetObject(ShedIdElem);
              string ShedName = GetObject(ShedNameElem).ToString();

              result = new SheduleInfo(ShedId, ShedName);




Это свой лисапед недосериализатор. Пишу прямо сейчас. Пока получается полная чушь...

Нужно вытащить данные из XML и вернуть их в типизированном формате. Т.е. прочитать из атрибута какой там тип у поля, и конвертнуть его (для того и решил использовать Convert.ChangeType)
...
Рейтинг: 0 / 0
23.07.2013, 21:39
    #38341359
LINQStudent
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
Спасибо за ответы.
...
Рейтинг: 0 / 0
23.07.2013, 22:18
    #38341394
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
LINQStudent,
тогда перепишем расширение
))
Код: c#
1.
2.
3.
4.
5.
6.
7.
  public static object MyChangeTypeForString(this string str,string strtype)
        {
            var t = Type.GetType(strtype);
            if (str == null)
                return t != null && t.IsValueType ? Activator.CreateInstance(t) : null;
            return    Convert.ChangeType(str, t);
        }


только тип в атрибутах надо указывать без сленга..
...
Рейтинг: 0 / 0
23.07.2013, 22:21
    #38341395
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
наверное более правильно if (string.IsNullOrEmpty(str))
...
Рейтинг: 0 / 0
24.07.2013, 13:53
    #38342095
LINQStudent
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой?
Где-то в степи,

Спасибо большое. Ваше решение сработало.
Я не знал про Активатор.

Знания приходят с опытом, это понятно. Я не знал про Активатор, а только про Дефаулт.

В этом польза форума !
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / deault только для генериков? А как сгенерировать "умолчание", если тип передается строкой? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]