2010-09-28 10 views
3

J'écris certaines fonctionnalités Enum, et ont les éléments suivants:Conversion Null à Nullable Enum (générique)

public static T ConvertStringToEnumValue<T>(string valueToConvert, 
    bool isCaseSensitive) 
{ 
    if (String.IsNullOrWhiteSpace(valueToConvert)) 
     return (T)typeof(T).TypeInitializer.Invoke(null); 

    valueToConvert = valueToConvert.Replace(" ", ""); 
    if (typeof(T).BaseType.FullName != "System.Enum" && 
     typeof(T).BaseType.FullName != "System.ValueType") 
    { 
     throw new ArgumentException("Type must be of Enum and not " + 
      typeof (T).BaseType.FullName); 
    } 

    if (typeof(T).BaseType.FullName == "System.ValueType") 
    { 
     return (T)Enum.Parse(Nullable.GetUnderlyingType(typeof(T)), 
      valueToConvert, !isCaseSensitive); 
    } 

    return (T)Enum.Parse(typeof(T), valueToConvert, !isCaseSensitive); 
} 

Je donne maintenant ce qui suit:

EnumHelper.ConvertStringToEnumValue<Enums.Animals?>("Cat"); 

Cela fonctionne comme prévu . Toutefois, si je l'exécute:

EnumHelper.ConvertStringToEnumValue<Enums.Animals?>(null); 

il casse avec l'erreur que TypeInitializer est null.

Est-ce que quelqu'un sait comment résoudre ce problème?

Merci à tous!

+1

Pourquoi diable êtes-vous Invoquer le initialiseur de type ?? Dans mes 9 années de C#, je n'ai jamais eu besoin de le faire! – leppie

+0

En fait, cet initialiseur de type ne retourne rien. Le code est faux, désolé. – leppie

+1

@leppie, d'où mon affichage de la question. Je cherche un moyen de faire ce qui précède, et clairement le TypeInitializer n'est pas la bonne façon de le faire. La réponse ci-dessous de Preet est ce que je cherchais. – Richard

Répondre

9

essayer

if (String.IsNullOrWhiteSpace(valueToConvert)) 
       return default(T); 
0

J'ai une approche différente, en utilisant l'extension et génériques.

public static T ToEnum<T>(this string s) { 
    if (string.IsNullOrWhiteSpace(s)) 
     return default(T); 

    s = s.Replace(" ", ""); 
    if (typeof(T).BaseType.FullName != "System.Enum" && 
     typeof(T).BaseType.FullName != "System.ValueType") { 
     throw new ArgumentException("Type must be of Enum and not " + typeof(T).BaseType.FullName); 
    } 

    if (typeof(T).BaseType.FullName == "System.ValueType") 
     return (T)Enum.Parse(Nullable.GetUnderlyingType(typeof(T)), s, true); 

    return (T)Enum.Parse(typeof(T), s, true); 
} 

Utilisez comme ça ...

Gender? g = "Female".ToEnum<Gender?>(); 
0

Celui-ci obtient le travail fait et il semble aussi assez. J'espère que cela aide!

/// <summary> 
    /// <para>More convenient than using T.TryParse(string, out T). 
    /// Works with primitive types, structs, and enums. 
    /// Tries to parse the string to an instance of the type specified. 
    /// If the input cannot be parsed, null will be returned. 
    /// </para> 
    /// <para> 
    /// If the value of the caller is null, null will be returned. 
    /// So if you have "string s = null;" and then you try "s.ToNullable...", 
    /// null will be returned. No null exception will be thrown. 
    /// </para> 
    /// <author>Contributed by Taylor Love (Pangamma)</author> 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="p_self"></param> 
    /// <returns></returns> 
    public static T? ToNullable<T>(this string p_self) where T : struct 
    { 
     if (!string.IsNullOrEmpty(p_self)) 
     { 
      var converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)); 
      if (converter.IsValid(p_self)) return (T)converter.ConvertFromString(p_self); 
      if (typeof(T).IsEnum) { T t; if (Enum.TryParse<T>(p_self, out t)) return t;} 
     } 

     return null; 
    } 

https://github.com/Pangamma/PangammaUtilities-CSharp/tree/master/src/StringExtensions