我希望能够轻松地将单个用户设置重置为其默认值。 我已经写了这样的扩展名:
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? 我需要做些什么来完成这项工作?
答案 0 :(得分:0)
没人? 这很糟糕,我会认为有更优雅的解决方案......
所以我现在正在使用它:
检查设置的类型是否为StringCollection
在" ArrayOfString / string"
...< - 不允许我将代码格式化为代码,而不需要额外的段落。怎么了?
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,不是吗?