2017-02-18 51 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,它失敗:

類型的未處理的異常則「」發生在 MYAPP.EXE

其他信息:無法強制轉換的對象鍵入'System.String' 鍵入'System.Collections.Specialized.StringCollection'。

這是因爲這些集合類型的默認值(存儲序列化爲XML)是返回字符串: set.Properties[key].DefaultValue.GetType()回報System.String

我可以在設置設計師通常,它只是蒙上價值StringCollection看:

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

但分配默認值,根據上述錯誤消息後失敗。

我嘗試在分配前投射XML字符串,但當然那裏也失敗了。

這樣的XML字符串在被分配到settings屬性之前如何轉換? 我需要做些什麼來完成這項工作?

回答

0

沒人? 那很爛,我會一直想有一個更好的解決方案...

所以我現在用這樣的:

  1. 檢查設置的類型是StringCollection

  2. 在「ArrayOfString /串」

    讀出XML元素

... < - 不會讓我的格式代碼代碼,而無需額外的面值agraph這裏。我勒個去?

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的方式。 我無法想象它可能會像這樣哈克,可以嗎?