XDocument в настройках - PullRequest
       24

XDocument в настройках

2 голосов
/ 05 июля 2011

Я пытаюсь вручную ввести XDocument на панели настроек VS2010, но безуспешно. Тип System.Xml.Linq.XDocument

Я получаю сообщение:

Не может быть преобразовано в экземпляр типа 'System.Xml.Linq.XDocument'

Кто-нибудь знает способ обойти это?

ST

1 Ответ

5 голосов
/ 05 июля 2011

Невозможно создать настройку 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 было моим именем).

...