Проверить преобразование строки типа в другие типы

Я использую отражение и хочу выполнить проверку преобразования для обработки исключений.

Мне нужно проверить, можно ли преобразовать строку в неизвестный тип в моем проекте.

Я использовал :

TypeConverter t = TypeDescriptor.GetConverter(typeof(string));
            Console.WriteLine(t.CanConvertTo(typeof(int)));

но возвращает false!

или даже этот снова возвращает false:

StringConverter stringConverter = new StringConverter();
            Console.WriteLine(stringConverter.CanConvertTo(typeof(int)));

мой вопрос заключается в том, что почему StringConverter возвращает false для преобразования строки в int ???

РЕДАКТИРОВАТЬ:

Я использую этот код для преобразования строки в неизвестные типы: (результат - строка)

resultCastedToTargetPropertyType = Convert.ChangeType(result,propertyInfo.PropertyType);

person Parsa    schedule 28.03.2018    source источник
comment
Можете ли вы показать нам код, который вы бы использовали для преобразования строки в int?   -  person mjwills    schedule 28.03.2018
comment
StringConverter Этот конвертер можно преобразовать только в строку.   -  person aleha    schedule 28.03.2018
comment
Что возвращает TypeConverter t = TypeDescriptor.GetConverter(typeof(int)); Console.WriteLine(t.CanConvertFrom(typeof(string)));?   -  person mjwills    schedule 28.03.2018
comment
@mjwills возвращает истину! это странно! почему противоположный возвращает false ?!   -  person Parsa    schedule 28.03.2018
comment
Потому что спрашивают, может ли преобразователь строк преобразовать в int. А другой спрашивает, может ли преобразователь int конвертировать из строки.   -  person mjwills    schedule 28.03.2018
comment
Конвертер строк @mjwills по логике ДОЛЖЕН преобразовывать в int! потому что строка может преобразовываться в int, например, с 123 в 123, но, похоже, это невозможно!   -  person Parsa    schedule 28.03.2018
comment
По логике, я должен уметь поднимать 100 кг. Но увы не могу. Вещи не всегда такие, как нам хотелось бы. Серьезно - документы довольно ясны - msdn.microsoft.com/en-us/library/.   -  person mjwills    schedule 28.03.2018


Ответы (3)


Помимо странностей реализации CanConvertFrom, в вашем контексте вы не получите особой помощи, зная, что определенное преобразование может быть выполнено, пока вы его не попробуете. Конвертер не может дать вам окончательный ответ, основанный только на типе, по той же причине, что не существует однозначного ответа на вопрос «можно ли преобразовать строку в целое число»: ответ будет «это зависит от строки», т. Е. Строка "123" можно преобразовать в int, а строки "hello" и "1234567891011121314151617181920" нельзя преобразовать в int.

Другими словами, ответ можно было получить, только зная преобразовываемое значение. В вашем случае это означает размещение блока _7 _ / _ 8_ вокруг вашего вызова Convert.ChangeType и интерпретацию каждого из четырех исключений, которые он может вызвать (ссылка).

person Sergey Kalinichenko    schedule 28.03.2018
comment
Я хотел избавиться от try / catch, чтобы сделать свой код более понятным. Также я не собираюсь проверять просто int. Мне нужно было проверить преобразование строки в неизвестные типы. но поскольку в int это работает не так, как я ожидал, я упомянул int. - person Parsa; 28.03.2018
comment
@Parsa Я понимаю, что вы хотели избавиться от try / catch в своем вопросе и пытались объяснить, почему это невозможно сделать в общем случае. То есть, по крайней мере, до тех пор, пока Convert не добавит TryChangeType или аналогичный метод без метания. - person Sergey Kalinichenko; 28.03.2018

StringConverter заботится только о string. Вам понадобится System.ComponentModel.Int32Converter. Int32Converter заботится о int. TypeDescriptor.GetConverter(typeof(int)) дает вам это.

По сути, TypeConverter обычно используется для форматирования целевого типа для отображения или для синтаксического анализа ввода обратно в этот целевой тип. Нет ничего особенного в отображении или синтаксическом анализе строки в / из строки, поэтому вы не удивитесь, узнав, что StringConverter делает очень мало! Здесь интересен тип int, а Int32Converter знает, как форматировать int для отображения и анализировать int из ввода.

person Marc Gravell    schedule 28.03.2018

Документы для состояния StringConverter:

Этот конвертер может преобразовывать только в строку. Он работает как проход для других конвертеров, которые хотят преобразовать объект в строку.

Int32Converter , с другой стороны, заявляет:

Этот преобразователь может преобразовывать только 32-разрядный целочисленный объект со знаком в строку и обратно. Тип значения Int32 представляет целые числа со знаком со значениями в диапазоне от отрицательного 2 147 483 648 до положительного 2 147 483 647.

Таким образом, вы, вероятно, захотите использовать Int32Converter, а не StringConverter.

В качестве альтернативы рассмотрите возможность написания метода расширения Convert.TryChangeType с блоком try catch в нем - это избавит вас от необходимости беспокоиться об отдельных преобразователях. Фактически вы «попробуете и увидите». Это особенно важно при преобразовании, когда вы не уверены, будут ли они работать до времени выполнения (например, "abc" в int).

person mjwills    schedule 28.03.2018