Duplicate possible:
existe-t-il une fonction générique Parse () qui convertira une chaîne en n'importe quel type en utilisant parse?
Je veux créer une fonction générique pour effectuer certaines opérations, comme:
ConvertValue<T>(string value)
Si T
est int
alors la fonction convertira la valeur en int
et renverra le résultat.
De même, si T
est boolean
, la fonction convertira le value
en boolean
et le renverra.
Comment écrire ça?
Quelque chose comme ça?
public static T ConvertValue<T>(string value)
{
return (T)Convert.ChangeType(value, typeof(T));
}
Vous pouvez ensuite l'utiliser comme ceci:
int val = ConvertValue<int>("42");
Edit:
Vous pouvez même faire cela plus générique et ne pas compter sur un paramètre string
à condition que le type U
implémente IConvertible
- cela signifie que vous devez spécifier deux paramètres de type:
public static T ConvertValue<T,U>(U value) where U : IConvertible
{
return (T)Convert.ChangeType(value, typeof(T));
}
J'ai envisagé d'attraper l'exception InvalidCastException
qui pourrait être déclenchée par Convert.ChangeType()
- mais que retourneriez-vous dans ce cas? default(T)
? Il semble plus approprié que l'appelant règle l'exception.
Bien que l’apparence IConvertible
ne soit probablement pas aussi nette, vous pouvez toujours utiliser la vérification simple typeof(T)
pour renvoyer un 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)
{}
}