Динамическое перечисление 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