2011-08-04 48 views
3

.NET支持FlagsAttribute用于枚举的,这表明“该枚举可以被视为一个位字段”。如何在Spring.NET配置中将多个枚举值赋给一个属性?

枚举,使得使用此[旗]属性的一个例子是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到关键P.没问题。但是,由于这是一条捷径,我想指定一些类似Control + P的快捷键。

如果我想在代码中这样组装起来,这将是:

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

所以,也许我是有点天真的尝试是:

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

这失败,因为EnumConverter只能解析/转换单个枚举的字符串表示。完整的堆栈跟踪如下。

  • 这是可能的默认Spring.NET?
  • 我可以解决此通过指定/使用其他EnumConverter?
  • 我应该创建/使用另一个键类做Spring.NET初始化?

UPDATE:

显然,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)] 
+1

不是一个解决方案,但是一种替代方法是存储底层数字值,而不是枚举本身。 – InBetween

+0

不错的发现 - 你可以发布自己的问题的答案,并接受它,但只有一天后。请稍后再做,所以我们都可以看到你的问题已经解决,并且upvote你的答案也是;-) – Marijn

+0

谢谢,我会在明天发布。我通过查看单声道源代码实际上找到了KeysConverter的'+'功能。 – toong

回答

4

如果你看一下春天.NET文档例如5.11 Configuration of IApplicationContext,您可以看到如何为给定类型添加特定类型转换器的示例。

添加在应用型钥匙的KeysConverter。配置就足够了:

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

现在enumvalue /快捷方式可以这样来指定:

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

不错!没想到这个! – bbaia

1

尝试使用规划环境地政司(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" /> 
+0

第一个选项失败:对象初始化失败:无法初始化属性或字段节点'Keys',因为指定的上下文为空。 ---> Spring.Core.NullValueInNestedPathException:由于指定的上下文为空,无法初始化属性或字段节点'Keys'。 – toong

+0

第二个选项失败:对象的初始化失败:无法从字符串值“System.Windows.Forms.Keys.Control”加载类型。 ---> System.TypeLoadException:无法从字符串值'System.Windows.Forms.Keys.Control'加载类型。 – toong

+0

第一个选项失败,因为Keys枚举不在mscorlib中,所以必须使用Spring TypeRegistry注册它,请参阅[docs](http://www.springframework.net/doc-latest/reference/html/) expressions.html#表达式-typeregistration)。 – Marijn

1
<property name="ShortcutKeys" value="Control, P" /> 
相关问题