Преобразование объектов в тип bool


Следующий метод расширения, который используется в нашем коде:

public static bool ToBool(this object src)
{
    return src != null && ((string) src).ToBool(false);
}

Он использует другой метод расширения:

public static bool ToBool(this string src, bool defaultValue)
{
    if (src.IsEmpty())
        return defaultValue;

    if (src.IsNumeric())
        return src.ToInt() != 0;

    var ret = false;
    if (bool.TryParse(src, out ret))
        return ret;
    return defaultValue;
}

(где ToInt и все это* методы фантики вокруг соответствующих объектов IsNullEmpty / анализировать способ)

Это не "чувствовать" право, но я не могу объяснить это автору. Помимо очевидных проблем передачи объекта, который не может быть приведен к строке, что и другие причины есть, чтобы оправдать это плохой код?

Существуют ли какие-либо конкретные причины, почему этот код может быть хорошо или плохо?



8185
8
задан 22 февраля 2011 в 10:02 Источник Поделиться
Комментарии
2 ответа

Я критикую:


  • Методов расширения на "объект" следует избегать из-за широкого размаха, за исключением особых случаев (что такое "ToBool" метод не один). Он также чувствует, как чрезмерное использование методов расширения.

  • Первый "объект", но очень хочет строку, и взорвут, с которого вызывается invalidcastexception во время выполнения.

  • Второй не проверить значение null (что не было бы проблемой само по себе, но имея перегрузок по умолчанию значения с различным поведением-это плохо).

7
ответ дан 22 февраля 2011 в 11:02 Источник Поделиться

Создание и расширение метод для объекта , который будет бросать исключение, если реальный объект не является строкой, может привести к неприятностям.

Кроме того, общий подход выглядит очень похоже на попытку создать динамический тип системы, где вы можете использовать любой тип и назвать ToXxx , чтобы преобразовать в любой тип вам нужно, используя "разумные" правила. Это действительно то, что вы хотите в сильно типизированных языков, как C#?

У вас есть какие-либо гарантии, что ToBool не бросают исключений, даже если он передается строка? Что если статистика возвращает true, но ToInt бросает исключение? Ничего из этого кода, кажется, чтобы принять настройки культуре во внимание, хотя он анализирует строки в число и может неожиданно сломаться, если работать в другой культуре.

6
ответ дан 22 февраля 2011 в 11:02 Источник Поделиться