Я пытаюсь использовать System.ComponentModel.TypeConverter для преобразования группы System.Strings в разные типы. Эти строки могут иметь или не иметь допустимый формат для TypeConverter, поэтому я хотел бы найти способ проверить их действительность перед попыткой преобразования типа (чтобы избежать необходимости полагаться на перехват System.FormatException, чтобы указать, что String не в правильном формате).
Отлично, поэтому у TypeConverters есть метод IsValid (), верно? Что ж, я столкнулся с проблемой, когда IsValid () вернет true, но когда я вызываю ConvertFromString (), он выдает исключение. Вот код для воспроизведения проблемы:
System.ComponentModel.DateTimeConverter DateConversion =
new System.ComponentModel.DateTimeConverter();
String TheNumberZero = "0";
if (DateConversion.IsValid(TheNumberZero))
Console.WriteLine(DateConversion.
ConvertFromString(TheNumberZero).ToString());
else
Console.WriteLine("Invalid.");
Когда я запускаю это, строка
Console.WriteLine(DateConversion.
ConvertFromString(TheNumberZero).ToString());
Выдает исключение System.FromatException с сообщением
0 is not a valid value for DateTime.
Какова цель метода IsValid (), если не проверять ввод преобразования перед попыткой преобразования типа? Есть ли способ проверить действительность String, не перехватывая FormatException?
3 ответа
Документация - ваш друг:
Метод IsValid используется для проверки значение внутри типа , а не определить, можно ли преобразовать значение в данного типа . Например, IsValid может использоваться, чтобы определить, значение действительно для перечисления тип. Для примера см. EnumConverter.
Вы можете написать свой собственный метод WillConvertSucceed, заключив методы ConvertTo и ConvertFrom в блоки исключений.
Это пример кода того, что было предложено ck.
Обычно, когда вам действительно нужно знать, будет ли работать синтаксический анализ типа значения, этот метод следует использовать.
DateTime convertedDate;
string zero = "0";
if (!DateTime.TryParse(zero, out convertedDate))
{
throw new InvalidCastException(string.Format(
"Attempted Invalid Cast of {0} to DateTime",zero));
}
Похоже, TryParse на Int32, DateTime, Decimal и т. Д. Может быть немного более полезным и эффективным.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.