EnumValue в TypeConverter
У меня есть класс со свойствами, такими как:
[TypeConverter(typeof(SomeNameEnumValueConvert))]
public Example ExampleName { get; set; }
В моем Enum TypeConverter я пытаюсь получить имя Enum из определенного целого числа, потому что источник читает из таблицы, состоящей из строк.
В таблице он хранится как, например, "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
}
Однако здесь указывается, что контекст - это переменная, а не тип. Итак, я пробовал различные способы заставить это работать, но параллельно с этим я опубликую это здесь, возможно, это ускоряет попытки. Я пробовал приведение к Enum, приведение к (enum)(объект), приведение через GetType, приведение через Assembly для получения определенного типа, но, похоже, ничего из этого не работает. Поэтому как конвертировать в базовый тип системы.
3 ответа
Чтобы получить имя enum (например, "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);
}
Чтобы получить член enum (например, 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);
}
}
Просто попробуйте это в вашем конвертере:
Example expEnum = (Example)Enum.Parse(typeof(Example), value.ToString(), true);
return expEnum;