获取用户设置集合类型' Visual Studio .NET中的默认值

时间:2017-02-18 18:06:52

标签: c# visual-studio

我希望能够轻松地将单个用户设置重置为其默认值。 我已经写了这样的扩展名:

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.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;
    }
}

但是在使用上面的错误消息分配DefaultValue后失败了。

我在分配之前尝试过铸造XML String,但当然也失败了。

在分配给settings属性之前,如何转换这样的XML String? 我需要做些什么来完成这项工作?

1 个答案:

答案 0 :(得分:0)

没人? 这很糟糕,我会认为有更优雅的解决方案......

所以我现在正在使用它:

  1. 检查设置的类型是否为StringCollection

  2. 在" ArrayOfString / string"

  3. 中读出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相同的方式获取默认值的方法。 我无法想象它可能会像这样一样hacky,不是吗?