Тип возврата общего метода

У меня есть общий метод, который должен возвращать объект родового типа. Некоторый код:

public static T Foo<T>(string value)
{
    if (typeof(T) == typeof(String))
        return value;

    if (typeof(T) == typeof(int))
        return Int32.Parse(value);

    // Do more stuff
}

Я вижу, что компилятор может жаловаться на это ( "Невозможно преобразовать тип" String "в" T "), даже если код не должен вызывать логические ошибки. Есть ли способ достичь того, что я ищу? Кастинг не помогает...

Ответ 1

Ну, вы можете сделать это:

public static T Foo<T>(string value)
{
    if (typeof(T) == typeof(String))
        return (T) (object) value;

    if (typeof(T) == typeof(int))
        return (T) (object) Int32.Parse(value);

    ...
}

Это будет включать бокс для типов значений, но он будет работать.

Вы уверены, что это лучше всего сделать как один метод, а не (скажем) общий интерфейс, который может быть реализован разными конвертерами?

В качестве альтернативы вам может понадобиться Dictionary<Type, Delegate>:

Dictionary<Type, Delegate> converters = new Dictionary<Type, Delegate>
{
    { typeof(string), new Func<string, string>(x => x) }
    { typeof(int), new Func<string, int>(x => int.Parse(x)) },
}

тогда вы будете использовать его следующим образом:

public static T Foo<T>(string value)
{
    Delegate converter;
    if (converters.TryGetValue(typeof(T), out converter))
    {
        // We know the delegate will really be of the right type
        var strongConverter = (Func<string, T>) converter;
        return strongConverter(value);
    }
    // Oops... no such converter. Throw exception or whatever
}