X设置中的文档

本文关键字:文档 设置 | 更新日期: 2023-09-27 18:01:01

我试图在VS2010的设置窗格中手动输入XDocument,但没有成功。类型为System.Xml.Linq.XDocument

我得到的信息是:

无法转换为类型的实例"System.Xml.Linq.XDocument">

有人知道这方面的办法吗?

ST

X设置中的文档

不能直接创建XDocument设置,因为XDocument类不符合设置用于确定是否可以使用类型的标准:

应用程序设置可以存储为任何可XML序列化的数据类型,或者具有实现ToString/FromString的TypeConverter。最常见的类型是String、Integer和Boolean,但也可以将值存储为Color、Object或连接字符串。

XDocument提供了一种通过解析字符串来创建XML文档的方法,但它不是构造函数,而是静态Load方法(它采用TextWriter,而不是字符串(。因此,它不适合在"设置"中使用。

但是您可以将其子类化,并为子类提供一个类型转换器。幸运的是,用类型转换器将XDocument子类化非常容易。首先,创建一个子类:

[TypeConverter(typeof(MyXDocumentTypeConverter))]
public class MyXDocument : XDocument
{
}

该类使用此TypeConverter:

public class MyXDocumentTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return (sourceType == typeof (string));
    }
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value is string)
        {
            MyXDocument d = new MyXDocument();
            d.Add(XDocument.Load(new StringReader((string) value)).Elements().First());
            return d;
        }
        return null;
    }
}

一旦你设置好了,你就可以写这样的代码:

MyXDocument d = "<foo/>";

并且字符串<foo/>将被传递到类型转换器并且被解析(经由Load(到XDocument,其顶层元素随后被添加到MyXDocument。这与Settings.Designer.cs中自动生成的代码使用的分配相同:

return ((global::XmlSettingsDemo.MyXDocument)(this["Setting"]));

现在,您可以进入"设置"对话框并创建此类型的设置。无法在"类型"对话框中导航到该类型;您必须手动输入类型的全名(XmlSettingsDemo.MyXDocument是我的名称(。