EnumValue в TypeConverter - PullRequest
       10

EnumValue в TypeConverter

0 голосов
/ 15 января 2019

У меня есть класс со свойствами, такими как:

[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 ]

0 голосов
/ 15 января 2019

Чтобы получить имя перечисления (например, «Вкл.») Из значения, вы можете использовать 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);
}
0 голосов
/ 15 января 2019

Вы можете попробовать это, если хотите общее решение:

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);
    }
}
0 голосов
/ 15 января 2019

Просто попробуйте это в вашем конвертере:

Example expEnum = (Example)Enum.Parse(typeof(Example), value.ToString(), true);
return expEnum;
...