2011-07-05 15 views
2

我想在VS2010的設置窗格中輸入一個XDocument,但沒有成功。該類型是System.Xml.Linq.XDocument設置中的XDocument

我得到的消息是:

不能轉換到類型的實例 「System.Xml.Linq.XDocument」

有誰知道周圍的方式這個?

ST

回答

5

不能創建一個XDocument直接設置,因爲XDocument類不符合使用的設置,以確定criteria如果一個類型,可以用:

應用程序設置可以存儲爲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是我的名字)。

+0

謝謝羅伯特給出了一個最全面和周到的答案。這使我能夠實現我的目標 - 再次感謝您! – Spod22