如何在 ConfigurationSection 中使用自定义类型的值?

How can I use values of custom type in ConfigurationSection?

假设我有 Point2D 类型(这是 example),我如何将此类型与 ConfigurationSection 一起使用——换句话说,什么为了从字符串创建我的类型的值,我必须实现的方法。

一种方法是提供TypeConverter,还有其他方法吗?在不引入额外类型的情况下,仅在我的自定义类型中(在此示例中 Point2D)?

另一种方法,但它更像是一个技巧,例如具有已知类型 int 的属性 xy,然后提供创建者属性 得到 Point2D -- 我不想走那条路。

更新: 请求示例:

public sealed class MyConfig : ConfigurationSection
{
    [ConfigurationProperty("LeftPoint", IsRequired = true),
        TypeConverter(typeof(Point2DTypeConverter))]
    public Point2D LeftPoint
    {
        get { return (Point2D )this["LeftPoint"]; }
        set { this["LeftPoint"] = value; }
    }

    ...
}

如您所见,我为 Point2D 使用了类型转换器并且它有效。没问题。但是我想知道是否可以在我的类型 Point2D 中进行转换(真正从字符串解析),这样我就可以删除整个转换器(不是作为属性标记,而是完全删除)。

由于这是一个可靠的要求,我建议使用 Newtonsoft.Json 与字符串相互转换。

string MyPoint = Json.Serialize(MyPointObject)

Point2d MyPoint = Json.Deserialize(ConfigurationSection..)

您还可以通过创建自定义 ConfigurationSections 来抽象您的序列化逻辑,如下所述:How:To Create Custom ConfigurationSections

对于 ConfigurationProperty

TypeConverter 需要一种或另一种形式。如果您不提供 - 如有必要,它将使用 TypeDescriptor.GetConverter 查找。为此,你的类型本身应该用 TypeConverter 属性装饰,所以你不能以这种方式摆脱它(尽管你可以将转换的责任转移到类型本身)。您也可以使用泛型 TypeConverter,但为此您需要将目标类型传递给它,这使用 ConfigurationProperty 属性是不可能的(但如果您手动配置属性而不使用属性,则可以)。总而言之 - 总是涉及 TypeConverter。