C # TypeConverters и IsValid - PullRequest
       11

C # TypeConverters и IsValid

0 голосов
/ 07 декабря 2009

Я пытаюсь использовать System.ComponentModel.TypeConverter для приведения множества System.Strings к различным типам. Эти строки могут иметь или не иметь допустимый формат для TypeConverter, поэтому я хотел бы найти способ проверить их действительность перед попыткой преобразования типа (чтобы избежать необходимости полагаться на перехват System.FormatException для указания того, что String не в правильном формате).

Отлично, вот почему TypeConverter имеет метод 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 (), если не проверять входные данные преобразования перед попыткой преобразования типа? Есть ли какой-нибудь способ проверить правильность строки, кроме необходимости перехватывать FormatException?

Ответы [ 3 ]

3 голосов
/ 07 декабря 2009

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

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

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

1 голос
/ 08 декабря 2009

Это пример кода того, что было предложено 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));
        }
0 голосов
/ 08 декабря 2009

Звучит как TryParse для Int32, DateTime, Decimal и т. Д. Может быть немного более полезным и эффективным.

...