不可变类型作为配置属性

Mar*_*ann 6 .net c# configuration serialization

是否可以将不可变类型用作.NET配置API的配置属性?

假设我有一个名为MyClass的不可变类型:

public class ImmutableClass
{
    private readonly int value;

    public ImmutableClass(int value)
    {
        this.value = value;
    }

    public int Value
    {
        get { return this.value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在ConfigurationSection中使用此类型作为配置属性:

public class MyConfigurationSection : ConfigurationSection
{
    [ConfigurationProperty("foo")]
    public ImmutableClass Foo
    {
        get { return (ImmutableClass)base["foo"]; }
        set { base["foo"] = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我无法序列化和反序列化MyConfigurationSection,因为它会抛出此异常:

System.Configuration.ConfigurationErrorsException:属性"criterion"的值无法转换为字符串.错误是:无法找到支持转换为/来自字符串的转换器,用于"FindCriterion"类型的属性"标准".

如果我从ConfigurationElement派生ImmutableClass,当我尝试序列化和反序列化配置部分时,我得到此异常:

System.Reflection.TargetInvocationException:调用目标抛出了异常.---> System.Reflection.TargetInvocationException:调用目标抛出了异常.---> System.MissingMethodException:没有为此对象定义的无参数构造函数.

我完全控制了ImmutableClass,所以我可以实现任何需要的接口.

有什么方法可以挂钩到配置API,以便可以这种方式使用ImmutableClass?

小智 1

您也许可以使用一些TypeConverters来帮助完成此过程(链接到 System.Configurations.ConfigurationConverter)。

真正的问题是你为什么要给自己惹这么多麻烦?只是有些时候,退缩并接受它比奋起反抗更好。如果您尝试以除为您指定的特定方式之外的任何方式进行操作,框架的某些部分会令人沮丧......