Подтвердить что ты не робот

Как создать функцию родового типа

Возможный дубликат:
существует ли общая функция Parse(), которая преобразует строку в любой тип, используя синтаксический анализ?

Я хочу создать общую функцию для выполнения некоторых операций, например:

ConvertValue<T>(string value)

Если T - int, тогда функция преобразует значение в int и вернет результат.

Аналогично, если T - boolean, функция преобразует value в boolean и вернет его.

Как это записать?

4b9b3361

Ответ 1

Что-то вроде этого?

public static T ConvertValue<T>(string value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}

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

int val = ConvertValue<int>("42");

Edit:

Вы даже можете сделать это более общим и не полагаться на параметр string, если тип U реализует IConvertible - это означает, что вам нужно указать два параметра типа:

public static T ConvertValue<T,U>(U value) where U : IConvertible
{
    return (T)Convert.ChangeType(value, typeof(T));
}

Я подумал о том, чтобы поймать исключение InvalidCastException, которое может быть поднято Convert.ChangeType() - но что бы вы вернули в этом случае? default(T)? Кажется более уместным, если вызывающая сторона имеет дело с исключением.

Ответ 2

Несмотря на то, что, возможно, не такой чистый, как подход IConvertible, вы всегда можете использовать прямую проверку typeof(T) для возврата a T:

public static T ReturnType<T>(string stringValue)
{
    if (typeof(T) == typeof(int))
        return (T)(object)1;
    else if (typeof(T) == typeof(FooBar))
        return (T)(object)new FooBar(stringValue);
    else
        return default(T);
}

public class FooBar
{
    public FooBar(string something)
    {}
}

Ответ 3

ConvertValue (System.Object o), то вы можете разветкить результат o.GetType() и активировать o для типов, которые будут работать со значением.