Динамическое перечисление enum

Я хочу создать динамический двухсторонний конвертер для всех возможных перечислений в моем приложении.

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

Как я могу попасть туда? Мой подход уже двухсторонний, но требует статического приведения (MyEnum) в коде:

public class MyEnumConverter : MarkupExtension, IValueConverter 
        {
        public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture) {
            return (MyEnum)value;
        }

        public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) {
            return (byte)value;
        }

        public override object ProvideValue(System.IServiceProvider serviceProvider) {
            return this;
        }
    }

2 ответа

Решение

Я считаю, что вы можете сделать это 2 разными способами.

Вариант 1: воспользоваться targetType Параметр методов конвертации. Когда вам нужно преобразовать в перечисление, тогда targetType это тип перечисления. Вы можете использовать один из статических методов на System.Enum класс, чтобы сделать преобразование.

Вариант 2. В вашем xaml используйте ConverterParameter для передачи типа enum, в который вы хотите преобразовать:

Converter={local:MyConverter, ConverterParameter={x:Type MyEnumType}}

Если вы идете по этому маршруту, то тип будет в parameter параметр методов конвертации. Опять же, статические методы на System.Enum класс сделает тяжелую работу за вас.

Попробуйте эти методы расширения. Он преобразует из перечисления в тип данных (int, byte,..) и из типа данных (int, byte,..) в перечисление наоборот...

    public static T ToEnumValue<T, E>(this E enumType)
    {
        return (T)Enum.ToObject(typeof(E), enumType);
    }

    public static E ToEnumType<T, E>(this T enumString)
    {
        return (E)Enum.Parse(typeof(E), enumString.ToString());
    }

Пример: Чтобы использовать вышеуказанные методы, возьмите перечисление

public enum EmployeeType
{
    Permanent = 0,
    Contract = 1,
}

int value = EmployeeType.Contract.ToEnumValue<int, EmployeeType>(); // 1
EmployeeType employeeType = value.ToEnumType<int, EmployeeType>();  // Contract
Другие вопросы по тегам