.NET поддерживает FlagsAttribute для перечисления, что означает " что перечисление можно рассматривать как битовое поле».
Примером перечисления, использующего этот атрибут [Flags], является Система.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 не поддерживает это?
Прикрепленная трассировка стека:
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)]