[英]Parse to Nullable Enum
I am trying to parse a string back to a nullable property of type MyEnum. 我试图将字符串解析回MyEnum类型的可空属性。
public MyEnum? MyEnumProperty { get; set; }
I am getting an error on line: 我在网上收到错误:
Enum result = Enum.Parse(t, "One") as Enum;
// Type provided must be an Enum. Parameter name: enumType
I have a sample console test below. 我在下面有一个示例控制台测试。 The code works if I remove nullable on the property
MyEntity.MyEnumProperty
. 如果我在属性
MyEntity.MyEnumProperty
上删除nullable,代码就可以工作。
How can I get the code to work without knowing the typeOf enum except via reflection? 除了通过反射之外,如何在不知道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
}
}
Adding a special case for Nullable<T>
will work: 为
Nullable<T>
添加一个特例将起作用:
Type t = myEnumPropertyInfo.PropertyType;
if (t.GetGenericTypeDefinition() == typeof(Nullable<>))
{
t = t.GetGenericArguments().First();
}
Here you go. 干得好。 A string extension that will help you with this.
一个字符串扩展,可以帮助您。
/// <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 https://github.com/Pangamma/PangammaUtilities-CSharp/tree/master/src/StringExtensions
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.