如何转换param" null"为空

时间:2015-07-21 15:42:11

标签: xml unity-container

我有一个XML配置文件,如下所示:

<register type='MyType'>
    <constructor>
        ...
        <param name='myString' value='null'/>
        ...
    </constructor>
</register>

如何将字符串"null"转换为null值?

我已尝试指定value=''但我收到错误:

  

属性值必须存在且非空。

并尝试了<param name='myString'/>,它给出了错误

  

无法构造String类型。您必须配置容器以提供此值。

最后(这是this page似乎建议的那样)

<instance name='myStringVal' />
<register type='MyType'>
    <constructor>
        ...
        <param name='myString' dependencyName='myStringVal'/>
        ...
    </constructor>
</register>

引发ArgumentNullException

修改,现在我也尝试了optional代码

<register type='MyType'>
    <constructor>
        ...
        <param name='myString'>
            <optional />
        </param>
        ...
    </constructor>
</register>

这也会引发ArgumentNullException

注意:与thisthis(可能还有其他几个)相关,但这些是关于C#中的配置,我想用XML配置。

2 个答案:

答案 0 :(得分:1)

我不相信XML具有真正的NULL值。您是否考虑过使用xsi:nil属性?

答案 1 :(得分:1)

您可以使用类型转换器将配置中的字符串转换为空字符串。 Unity不会让你把空字符串作为配置中的值,所以不幸的是,类型转换器必须使用&#34;魔术字符串&#34;识别空值:

<register type="MyClass" >
  <constructor>
    <param name="configValue" value="null" typeConverter="NullStringConverter" />
  </constructor>
</register>

在上面的&#34; null&#34;是类型转换器将寻找的神奇字符串:

public class NullStringConverter : System.ComponentModel.TypeConverter
{
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value == null || 
            (value.GetType() == typeof(string) && 
            String.Compare(value.ToString(), "null", StringComparison.OrdinalIgnoreCase) == 0))
        {
            return null;
        }

        return value.ToString();
    }
}