2011-07-05 10 views
2

XDocumentをVS2010の設定ペインに正しく入力せずに入力しようとしています。誰もが周りの道を知ってい設定内のXドキュメント

はタイプ のインスタンスに変換することはできません「System.Xml.Linq.XDocument」

:タイプは、私が手System.Xml.Linq.XDocument

メッセージがありますこの?

ST

答えて

5

XDocumentクラスはタイプが使用可能かどうかを判断するために設定が使用しcriteria満たしていないため、あなたは、直接設定XDocumentを作成することはできません。

アプリケーション設定をXMLシリアライズ可能な任意のデータ型として格納することも、ToString/FromStringを実装するTypeConverterを格納することもできます。最も一般的な型はString、Integer、Booleanですが、値をColor、Object、または接続文字列として格納することもできます。

XDocument文字列を解析して、XML文書を作成するための方法を提供し、それはコンストラクタではありません、それは(TextWriterをとり、文字列ではありません)静的Load方法です。したがって、設定での使用には適していません。

しかし、それをサブクラス化して、サブクラスにタイプコンバータを与えることができます。幸運にも、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経由で)、その最上位要素が012に追加されます。

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

今、あなたはあなたの設定]ダイアログに移動して、このタイプの設定を作成することができます。これはSettings.Designer.csで、自動生成されたコードが使用するのと同じ割り当てです。タイプダイアログでタイプにナビゲートすることはできません。あなたは手動でタイプのフルネームを入力する必要があります(XmlSettingsDemo.MyXDocumentは私の名前でした)。

+0

ロバートには、最も包括的で思慮深い答えがあります。これは私が達成しようとしていることを達成するのを可能にしました - もう一度ありがとう! – Spod22

関連する問題