2017-02-18 13 views
1

単一のユーザー設定をデフォルト値に簡単にリセットする機能が必要です。 私はそうのような拡張子を書いた:Visual Studio .NETでユーザー設定のコレクションの既定値を取得する

public static void sReset(this Properties.Settings set, string key = "") 
{ 
    if (key == "") 
    { 
     set.Reset(); 
     return; 
    } 
    Console.WriteLine("Reset '" + key + "' to: " + set.Properties[key].DefaultValue); 
    set.PropertyValues[key].PropertyValue = set.PropertyValues[key].Property.DefaultValue; 
} 

をそして、これはプリミティブ型のため正常に動作します。 しかし、今、私はstringCollectionにそれを適用したい、それが失敗します。

型「System.InvalidCastExceptionの」の未処理の例外がMYAPP.EXEで

発生しました追加情報:のオブジェクトをキャストすることができません'System.Collections.Specialized.StringCollection'と入力すると、 'System.String' と入力します。 set.Properties[key].DefaultValue.GetType()戻りSystem.String

が、私は通常、それだけでStringCollectionに値をキャスト設定デザイナで見ることができます(XMLとしてシリアライズ格納)これらのコレクション型のデフォルト値が文字列として返されるためです

public global::System.Collections.Specialized.StringCollection settingsName { 
    get { 
     return ((global::System.Collections.Specialized.StringCollection)(this["settingsName"])); 
    } 
    set { 
     this["settingsName"] = value; 
    } 
} 

ただし、上記のエラーメッセージでDefaultValueを割り当てた後に失敗します。

私は割り当ての前にXML文字列をキャストしようとしましたが、もちろん失敗しました。

このようなXML文字列は、設定プロパティに割り当てる前にどのように変換されていますか? これを行うには何が必要ですか?

答えて

0

誰もいませんか?

  1. チェック設定のタイプがStringCollection

  2. の場合:吸う、私はだから私は今、これを使用してい

    ...もっとエレガントな解決策があったと思っただろう

    < ...「がArrayOfString /文字列」

でXML要素を読む - 追加のパーずに私のコードのような形式のコードをできないだろうここに集計するなんてこったい?

public static void sReset(this Properties.Settings set, string key = "") 
{ 
    if (key == "") 
    { 
     set.Reset(); 
     return; 
    } 
    if (set.PropertyValues[key].Property.PropertyType == typeof(StringCollection)) 
    { 
     string tvs = (string)set.PropertyValues[key].Property.DefaultValue; 
     set.PropertyValues[key].PropertyValue = tvs.XmlToStringCollection(); 
     return; 
    } 
    set.PropertyValues[key].PropertyValue = set.PropertyValues[key].Property.DefaultValue; 
} 

public static StringCollection XmlToStringCollection(this string str) 
{ 
    StringCollection ret = new StringCollection(); 

    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.LoadXml(str); 
    XmlNodeList terms = xmlDoc.SelectNodes("ArrayOfString/string"); 

    foreach (XmlElement s in terms) 
    { 
     if (s.InnerXml != "") 
     { 
      Console.WriteLine("Found: " + s.InnerXml); 
      ret.Add(s.InnerXml); 
     } 
    } 
    return ret; 
} 

XMLは次のようになりますので、:、それは気醜いと限ら残念ださ

<?xml version="1.0" encoding="utf-16"?> 
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <string>first string</string> 
    <string>second string</string> 
    <string>...</string> 
</ArrayOfString> 

が...:

あなたはどのような種類のために同じことを行う必要があるだろうXMLのシリアライズ型の

本当に、私が望むのは、VSと同じ方法でデフォルト値を取得する方法です。 私はそれがこれと同じくらいハッキリかもしれないとは思いませんか?

関連する問題