2012-03-19 51 views
8

Tôi đang cố gắng phân tích cú pháp một chuỗi trở lại thành thuộc tính không có giá trị của loại MyEnum.Phân tích cú pháp thành Nullable Enum

public MyEnum? MyEnumProperty { get; set; } 

Tôi nhận được một lỗi trên dòng:

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

Tôi có một giao diện điều khiển thử nghiệm mẫu dưới đây. Mã hoạt động nếu tôi xóa giá trị rỗng trên thuộc tính MyEntity.MyEnumProperty.

Tôi làm cách nào để mã hoạt động mà không biết loạiOf enum ngoại trừ phản ánh?

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

Trả lời

14

Thêm một trường hợp đặc biệt cho Nullable<T> sẽ làm việc:

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

Vàng! Cảm ơn bạn rất nhiều –

+0

Tôi biết điều này là từ năm 2012, nhưng đối với bất kỳ ai vấp phải cùng một vấn đề (như tôi) - Một cải tiến nhỏ: Thêm một kiểm tra cho t.IsGenericType trước t.GetGenericTypeDefinition() == ..., nếu không mã có thể phá vỡ cho một loại enum không nullable –

0

Ở đây bạn đi. Một phần mở rộng chuỗi sẽ giúp bạn với điều này.

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

Các vấn đề liên quan