2012-03-19 13 views
8

Sto cercando di analizzare una stringa su una proprietà nullable di tipo MyEnum.Parse to Nullable Enum

public MyEnum? MyEnumProperty { get; set; } 

sto ottenendo un errore sulla linea:

Enum result = Enum.Parse(t, "One") as Enum; 
// Type provided must be an Enum. Parameter name: enumType 

Ho un test di console di esempio. Il codice funziona se rimuovo nullable sulla proprietà MyEntity.MyEnumProperty.

Come posso far funzionare il codice senza conoscere il tipo di enum tranne tramite riflessione?

static void Main(string[] args) 
    { 
     MyEntity e = new MyEntity(); 
     Type type = e.GetType(); 
     PropertyInfo myEnumPropertyInfo = type.GetProperty("MyEnumProperty"); 

     Type t = myEnumPropertyInfo.PropertyType; 
     Enum result = Enum.Parse(t, "One") as Enum; 

     Console.WriteLine("result != null : {0}", result != null); 
     Console.ReadKey(); 
    } 

    public class MyEntity 
    { 
     public MyEnum? MyEnumProperty { get; set; } 
    } 

    public enum MyEnum 
    { 
     One, 
     Two 
    } 
} 

risposta

14

Aggiunta di un caso speciale per Nullable<T> funzionerà:

Type t = myEnumPropertyInfo.PropertyType; 
if (t.GetGenericTypeDefinition() == typeof(Nullable<>)) 
{ 
    t = t.GetGenericArguments().First(); 
} 
+1

d'oro! Grazie mille –

+0

So che questo è del 2012, ma per chiunque si sia imbattuto nello stesso problema (come me) - Un piccolo miglioramento: Aggiungi un controllo per t.IsGenericType prima di t.GetGenericTypeDefinition() == ..., altrimenti il codice potrebbe rompersi per un tipo di enum non annullabile –

0

Qui si va. Un'estensione di stringa che ti aiuterà con questo.

/// <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