Я пытаюсь использовать 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?

0
Brian 7 Дек 2009 в 21:55

3 ответа

Лучший ответ

Документация - ваш друг:

Метод IsValid используется для проверки значение внутри типа , а не определить, можно ли преобразовать значение в данного типа . Например, IsValid может использоваться, чтобы определить, значение действительно для перечисления тип. Для примера см. EnumConverter.

Вы можете написать свой собственный метод WillConvertSucceed, заключив методы ConvertTo и ConvertFrom в блоки исключений.

3
plinth 7 Дек 2009 в 21:59
2
 – 
Pavel Minaev
7 Дек 2009 в 22:01
Означает ли это, что невозможно выяснить это заранее, не прибегая к обработке исключений?
 – 
Brian
7 Дек 2009 в 22:25
1
РЖУ НЕ МОГУ! Итак, вместо того, чтобы исправить ошибку, о которой сообщалось почти полвека назад, они изменили документацию? Исходная документация msdn.microsoft. com / en-us / library /… указывает только: «Возвращает, является ли данный объект значения допустимым для этого типа». Итак, исходя из этого утверждения, функция IsValid ДОЛЖНА сообщать нам, допустимо ли какое-либо данное значение в контексте методов ConvertFrom и ConvertTo.
 – 
Paulo Santos
3 Янв 2010 в 18:05
Минаев, @brian, @Paulo Santos: похоже, они исправили это в .NET 4.0 (msdn.microsoft.com/en-us/library/tez461eb (v = VS.100) .aspx)
 – 
Regent
26 Май 2010 в 13:23
В самом деле, и это также было записано как таковое в Connect.
 – 
Pavel Minaev
26 Май 2010 в 23:48

Это пример кода того, что было предложено 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));
        }
1
casperOne 16 Ноя 2010 в 18:36

Похоже, TryParse на Int32, DateTime, Decimal и т. Д. Может быть немного более полезным и эффективным.

-1
cjk 8 Дек 2009 в 00:14