103 votes

Existe-t-il une fonction générique de Parse() qui convertira une chaîne en n'importe quel type en utilisant parse ?

Je veux convertir une chaîne en un type générique comme int date long basé sur le type de retour générique.

Fondamentalement une fonction comme Parse<T>(String) qui renvoie un élément de type T.

Par exemple, si un int a été passé, la fonction doit faire int.parse en interne.

146voto

Ani Points 59747

System.Convert.ChangeType

Selon votre exemple, vous pourriez faire :

int i = (int)Convert.ChangeType("123", typeof(int));
DateTime dt = (DateTime)Convert.ChangeType("2009/12/12", typeof(DateTime));

Pour satisfaire à votre exigence de « type de retour générique », vous pouvez écrire votre propre méthode d'extension :

public static T ChangeType<T>(this object obj)
{
    return (T)Convert.ChangeType(obj, typeof(T));
}

Cela vous permettra de faire :

int i = "123".ChangeType<int>();

26voto

Pranay Deep Points 508

On dirait que je suis trop en retard pour répondre à ce fil. Mais voici ma mise en œuvre :

Fondamentalement, j'ai créé une méthode d'extension pour la classe Objet. Il gère tous les types, c'est-à-dire NULLABLE, classes et struct.

 public static T ConvertTo<T>(this object value)
           {
               T returnValue;

               if (value is T variable)
                   returnValue = variable;
               else
                   try
                   {
                       //Handling Nullable types i.e, int?, double?, bool? .. etc
                       if (Nullable.GetUnderlyingType(typeof(T)) != null)
                       {
                           TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
                           returnValue = (T) conv.ConvertFrom(value);
                       }
                       else
                       {
                           returnValue = (T) Convert.ChangeType(value, typeof(T));
                       }
                   }
                   catch (Exception)
                   {
                       returnValue = default(T);
                   }

               return returnValue;
           }

14voto

Eonasdan Points 3788

version plus propre de la réponse de Pranay

public static T ConvertTo<T>(this object value)
{
    if (value is T variable) return variable;

    try
    {
        //Handling Nullable types i.e, int?, double?, bool? .. etc
        if (Nullable.GetUnderlyingType(typeof(T)) != null)
        {
            return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value);
        }

        return (T)Convert.ChangeType(value, typeof(T));
    }
    catch (Exception)
    {
        return default(T);
    }
}

9voto

Alex Siepman Points 1054

System.Convert.ChangeType ne convertit en aucun type. Pensez à ce qui suit :

  • types de valeurs nulles
  • énums
  • Guid etc.

Ces conversions sont possibles avec cette implémentation de ChangeType.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X