Разобрать в Nullable Enum - PullRequest
       55

Разобрать в Nullable Enum

10 голосов
/ 19 марта 2012

Я пытаюсь выполнить синтаксический анализ строки обратно в свойство типа MyEnum, допускающее пустые значения.

public MyEnum? MyEnumProperty { get; set; }

Я получаю сообщение об ошибке:

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

У меня есть образец консолитест ниже.Код работает, если я удаляю nullable в свойстве MyEntity.MyEnumProperty.

Как заставить код работать, не зная перечисление typeOf, кроме как с помощью отражения?

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

Ответы [ 2 ]

15 голосов
/ 19 марта 2012

Добавление специального чехла для Nullable<T> будет работать:

Type t = myEnumPropertyInfo.PropertyType;
if (t.GetGenericTypeDefinition() == typeof(Nullable<>))
{
    t = t.GetGenericArguments().First();
}
0 голосов
/ 24 февраля 2017

Вот, пожалуйста. Расширение строки, которое поможет вам в этом.

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

...