Невозможно создать настройку XDocument
напрямую, поскольку класс XDocument
не соответствует критерию , используемому настройками для определения возможности использования типа:
Настройки приложения могут быть сохранены как любой тип данных, который можно сериализовать в формате XML или который содержит TypeConverter, который реализует ToString / FromString.Наиболее распространенными типами являются 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"]));
Теперь вы можете перейти в диалоговое окно «Настройки» и создать настройку этого типа.Вы не можете перейти к типу в диалоге Type;Вы должны вручную ввести полное имя типа (XmlSettingsDemo.MyXDocument
было моим именем).