web-dev-qa-db-fra.com

Comment créer une fonction de type générique

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?

63
Riz

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.

178
BrokenGlass

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)
    {}
}
9
BrandonAGr