Как создать функцию родового типа
Возможный дубликат:
существует ли общая функция Parse(), которая преобразует строку в любой тип, используя синтаксический анализ?
Я хочу создать общую функцию для выполнения некоторых операций, например:
ConvertValue<T>(string value)
Если T
- int
, тогда функция преобразует значение в int
и вернет результат.
Аналогично, если T
- boolean
, функция преобразует value
в boolean
и вернет его.
Как это записать?
Ответы
Ответ 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 для типов, которые будут работать со значением.