从Unity配置传递枚举值

时间:2015-07-01 00:32:02

标签: dependency-injection unity-container

我无法从Unity传递枚举值。这是我的枚举

public enum MyChoice
    {
        Choice1 = 1,
        Choice2 = 2
    }

我已为此枚举类型注册了typeAlias,如下所示。

<typeAlias alias ="MyChoice" type ="SomeNamespace.MyChoice, SomeAssembly" />

到目前为止一切顺利。现在,我需要从配置文件中将枚举值传递给类的构造函数。我这样做:

<register type="IMyInterface" mapTo="SomeClass" name="MyClass">
      <constructor>
        <param name ="choice" value="MyChoice.Choice1"  />
      </constructor>
</register>

我收到错误MyChoice.Choice1不是MyChoice的有效值

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

要使它开箱即用,您应该使用枚举的实际值而不是名称。在这种情况下,而不是&#34; MyChoice.Choice1&#34;你应该使用&#34; 1&#34;。

如果你想在配置中使用这个名字(尽管发布的例子,使用枚举名称几乎总是更有意义),那么你可以使用类型转换器。

以下是配置示例:

<typeAlias alias ="EnumConverter" type ="SomeNamespace.EnumConverter`1, SomeAssembly" />

<register type="IMyInterface" mapTo="SomeClass" name="MyClass">
  <constructor>
    <param name ="choice" value="Choice1" typeConverter="EnumConverter[MyChoice]" />
  </constructor>
</register>

然后创建EnumConverter:

public class EnumConverter<T> : System.ComponentModel.TypeConverter where T : struct
{
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        T result;

        if (value == null || !Enum.TryParse<T>(value.ToString(), out result))
        {
            throw new NotSupportedException();
        }

        return result;
    }
}