Преобразование строки в простой тип - PullRequest
1 голос
/ 21 мая 2010

.Net Framework содержит отличный класс с именем Convert, который позволяет выполнять преобразование между простыми типами, типом DateTime и типом String. Также класс поддерживает преобразование типов, реализующих интерфейс IConvertible.

Класс был реализован в самой первой версии .Net framework. В первой платформе .Net было несколько вещей, которые были сделаны не совсем правильно. Например, методы .Parse для простых типов будут генерировать исключение, если строка не может быть проанализирована, и нет способа проверить, будет ли выброшено исключение заранее.

В будущей версии .Net Framework этот недостаток был устранен путем введения метода TryParse, который решил эту проблему.

Класс Convert восходит ко времени старого метода Parse, поэтому метод ChangeType для этого класса в реализованном старом стиле - если преобразование не может быть выполнено, возникает исключение.

Взгляните на следующий код:

public static T ConvertString<T>(string s, T @default)
{
    try
    {
        return (T)Convert.ChangeType(s, typeof(T), CultureInfo.InvariantCulture);
    }
    catch (Exception)
    {
        return @default;
    }            
}

Этот код в основном делает то, что я хочу. Однако я бы очень хотел избежать здесь уродливой попытки / улова. Я уверен, что, как и в TryParse, существует современный метод переписывания этого кода без всеобщего сведения. Не могли бы вы предложить один?

1 Ответ

1 голос
/ 21 мая 2010

Нет такого метода, и никогда не будет.

Convert.Change вызывает IConvertible реализацию объекта, который вы передаете ему для выполнения преобразования.

Поскольку интерфейс IConvertible не определяет методы TryConvertTo, невозможно написать метод TryConvertTo. (Добавление новых методов к IConvertible будет серьезным критическим изменением)

Microsoft могла бы создать ISafeConvertible интерфейс с дополнительными методами, но я не думаю, что они это сделают.

...