TypeConverter 中的 EnumValue
EnumValue in TypeConverter
我有一个 class 具有如下属性:
[TypeConverter(typeof(SomeNameEnumValueConvert))]
public Example ExampleName { get; set; }
在我的 Enum TypeConverter 中,我尝试从某个整数中获取 Enum 名称,因为源正在读取由字符串组成的 table。
在table中,它存储为例如“33”(所以不是名字),例如来自
public enum Example
{
Off = 1,
On = 33,
Whatever = 7
}
然后是我的转换器代码:
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
var enumValue = Convert.ToInt32(value);
return (context.PropertyDescriptor.PropertyType) enumValue
}
然而,它在这里给出上下文是一个变量,不是一个类型。所以我尝试了各种方法来让它工作,但与此同时,我将 post 放在这里,也许这样可以加快重试速度。我试过转换为 Enum,转换为 (enum)(object),通过 GetType 进行转换,通过 Assembly 进行转换以获得特定类型,但是 none 这似乎有效。因此如何转换为底层系统类型。
只需在您的转换器中试试这个:
Example expEnum = (Example)Enum.Parse(typeof(Example), value.ToString(), true);
return expEnum;
要从值中获取枚举名称(例如 "On"),您可以使用 Enum.GetName
:
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var enumValue = Convert.ToInt32(value);
return Enum.GetName(context.PropertyDescriptor.PropertyType, enumValue);
}
要从值中获取枚举成员(例如 Example.On
),请使用 Enum.ToObject
:
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var enumValue = Convert.ToInt32(value);
return Enum.ToObject(context.PropertyDescriptor.PropertyType, enumValue);
}
如果你想要一个通用的解决方案,你可以试试这个:
public static class Example
{
enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
public static void Foo()
{
Day day = Day.Tue;
int dayIndex = day.ToInt();
// dayIndex = 2
Day result = (dayIndex + 2).ToEnum<Day>();
// result = Thu
}
public static int ToInt<T>(this T t) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enumeration type");
}
return Convert.ToInt32(t);
}
public static T ToEnum<T>(this int i) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enumeration type");
}
return (T)Enum.ToObject(typeof(T), i);
}
}
我有一个 class 具有如下属性:
[TypeConverter(typeof(SomeNameEnumValueConvert))]
public Example ExampleName { get; set; }
在我的 Enum TypeConverter 中,我尝试从某个整数中获取 Enum 名称,因为源正在读取由字符串组成的 table。
在table中,它存储为例如“33”(所以不是名字),例如来自
public enum Example
{
Off = 1,
On = 33,
Whatever = 7
}
然后是我的转换器代码:
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
var enumValue = Convert.ToInt32(value);
return (context.PropertyDescriptor.PropertyType) enumValue
}
然而,它在这里给出上下文是一个变量,不是一个类型。所以我尝试了各种方法来让它工作,但与此同时,我将 post 放在这里,也许这样可以加快重试速度。我试过转换为 Enum,转换为 (enum)(object),通过 GetType 进行转换,通过 Assembly 进行转换以获得特定类型,但是 none 这似乎有效。因此如何转换为底层系统类型。
只需在您的转换器中试试这个:
Example expEnum = (Example)Enum.Parse(typeof(Example), value.ToString(), true);
return expEnum;
要从值中获取枚举名称(例如 "On"),您可以使用 Enum.GetName
:
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var enumValue = Convert.ToInt32(value);
return Enum.GetName(context.PropertyDescriptor.PropertyType, enumValue);
}
要从值中获取枚举成员(例如 Example.On
),请使用 Enum.ToObject
:
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var enumValue = Convert.ToInt32(value);
return Enum.ToObject(context.PropertyDescriptor.PropertyType, enumValue);
}
如果你想要一个通用的解决方案,你可以试试这个:
public static class Example
{
enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
public static void Foo()
{
Day day = Day.Tue;
int dayIndex = day.ToInt();
// dayIndex = 2
Day result = (dayIndex + 2).ToEnum<Day>();
// result = Thu
}
public static int ToInt<T>(this T t) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enumeration type");
}
return Convert.ToInt32(t);
}
public static T ToEnum<T>(this int i) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enumeration type");
}
return (T)Enum.ToObject(typeof(T), i);
}
}