C # Помогите мне с удивительным кастингом - PullRequest
5 голосов
/ 01 марта 2012

Я пытаюсь написать метод для покрытия данного объекта экземпляром данного типа.Я начал с этого:

private static T TryCast<T>(object o)
{
    return (T) o;
}

Заходя, я знаю , что не сработает, но это иллюстрирует концепцию.Теперь у меня начнутся проблемы, когда у меня будут типы, которые не будут приводиться автоматически, например string -> DateTime.Я пытался использовать класс Convert для решения этих случаев, но я просто получаю ошибку времени компиляции вместо ошибки времени выполнения.Следующий код получает ошибку компиляции: «Невозможно привести выражение типа string к типу T»

private static T TryCast<T>(object o)
{
    var typeName = typeof (T).FullName;

    switch (typeName)
    {
        case "System.String":
            return (T) Convert.ToString(o);
        default:
            return (T) o;
    }
}

Мне также известно о Convert.ChangeType (), но мне интересно, будет лиобрабатывать крайние случаи, которые я иначе обработал бы в вышеупомянутом переключателе, например, указанная строка -> DateTime, для которой я обычно просто использовал бы Convert.ToDateTime.Если кто-нибудь может дать мне работоспособный подход , я могу взять его оттуда.

1 Ответ

6 голосов
/ 01 марта 2012

Convert.ChangeType должен обрабатывать крайние случаи;он делегирует IConvertible.

. Чтобы ответить на этот вопрос, компилятор не знает, что T равно string.
.точно так же, как вы не можете разыграть Button до TextBox).

Вы можете обойти это, применив сначала object:

return (T)(object)o.ToString();

Теперь каждое отдельное преобразованиеразрешено компилятором (это либо прямое повышение, либо прямое снижение), и вы знаете, что все это будет работать, потому что T это String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...