Как назначить несколько значений перечисления для свойства в конфигурации Spring.NET?

.NET поддерживает FlagsAttribute для enum, который указывает, что "перечисление может рассматриваться как битовое поле".

Примером перечисления, использующего этот атрибут [Flags], является System.Windows.Forms.Keys

Вот мое определение объекта Spring.NET:

<object id="command.paste" type="MyNamespace.PasteClipboardCommand, MyProject">
  <property name="Title" value="Paste into Folder" />
  <property name="ShortcutKeys" value="P" />
</object>

Это устанавливает свойство ShortcutKeys типа Keys для клавиши P. Никаких проблем там нет. Однако, поскольку это ярлык, я бы хотел назначить что-то вроде Control+P в качестве сочетания клавиш.

Если бы я связал это в коде, это было бы:

command.ShortcutKeys = Keys.Control | Keys.P;

Так что, может быть, я был немного наивным, пытаясь это:

<property name="ShortcutKeys" value="Control|P" />

Это терпит неудачу, потому что EnumConverter может только анализировать / преобразовывать строковые представления единственного перечисления. Полная трассировка стека доступна ниже.

  • Это возможно по умолчанию Spring.NET?
  • Могу ли я обойти это, указав / используя другой EnumConverter?
  • Должен ли я создать / использовать другой класс Keys для инициализации Spring.NET?

ОБНОВИТЬ:

Очевидно, KeysConverter знает, как справиться с этим следующим образом:

(new KeysConverter()).ConvertFrom(null, null, "Control+P");

К сожалению, EnumConverter не поддерживает это?

Прикрепленная Stacktrace:

System.Configuration.ConfigurationErrorsException: Error creating context 'spring.root': PropertyAccessExceptionsException (1 errors); nested PropertyAccessExceptions are: 
[Spring.Core.TypeMismatchException: Cannot convert property value of type [System.String] to required type [System.Windows.Forms.Keys] for property 'ShortcutKeys'., Inner Exception: System.FormatException: Control|P is not a valid value for Keys. ---> System.ArgumentException: Requested value 'Control|P' was not found.
    at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)
    at System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    --- End of inner exception stack trace ---
    at System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    at System.ComponentModel.TypeConverter.ConvertFromInvariantString(String text)
    at Spring.Core.TypeConversion.TypeConversionUtils.ConvertValueIfNecessary(Type requiredType, Object newValue, String propertyName)] ---> Spring.Objects.Factory.ObjectCreationException: Error creating object with name 'command.builder.paste' defined in 'file [....\commands.xml] line 39' : Error setting property values: PropertyAccessExceptionsException (1 errors); nested PropertyAccessExceptions are: 
[Spring.Core.TypeMismatchException: Cannot convert property value of type [System.String] to required type [System.Windows.Forms.Keys] for property 'ShortcutKeys'., Inner Exception: System.FormatException: Control|P is not a valid value for Keys. ---> System.ArgumentException: Requested value 'Control|P' was not found.
    at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)
    at System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    --- End of inner exception stack trace ---
    at System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    at System.ComponentModel.TypeConverter.ConvertFromInvariantString(String text)
    at Spring.Core.TypeConversion.TypeConversionUtils.ConvertValueIfNecessary(Type requiredType, Object newValue, String propertyName)] ---> PropertyAccessExceptionsException (1 errors); nested PropertyAccessExceptions are: 
[Spring.Core.TypeMismatchException: Cannot convert property value of type [System.String] to required type [System.Windows.Forms.Keys] for property 'ShortcutKeys'., Inner Exception: System.FormatException: Control|P is not a valid value for Keys. ---> System.ArgumentException: Requested value 'Control|P' was not found.
    at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)
    at System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    --- End of inner exception stack trace ---
    at System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    at System.ComponentModel.TypeConverter.ConvertFromInvariantString(String text)
    at Spring.Core.TypeConversion.TypeConversionUtils.ConvertValueIfNecessary(Type requiredType, Object newValue, String propertyName)]

3 ответа

Решение

Если вы посмотрите документацию Spring.NET 5.11 Конфигурация IApplicationContext, вы увидите пример того, как добавить конкретный конвертер типов для данного типа.

Достаточно добавить KeysConverter для типа Keys в app.config:

<converter for="System.Windows.Forms.Keys, System.Windows.Forms" type="System.Windows.Forms.KeysConverter, System.Windows.Forms"/>

Теперь enumvalue/shortcut можно указать так:

<property name="ShortcutKeys" value="Control+P" />
<property name="ShortcutKeys" value="Control, P" />

Попробуйте использовать SpEL (язык выражений Spring.NET): http://www.springframework.net/doc-latest/reference/html/expressions.html

<property name="ShortcutKeys" expression="Keys.Control or Keys.P" />

или же

<property name="ShortcutKeys" expression="T(System.Windows.Forms.Keys).Control or T(System.Windows.Forms.Keys).P" />
Другие вопросы по тегам