gpt4 book ai didi

c# - 在 Visual Studio .NET 中获取用户设置集合类型的默认值

转载 作者:行者123 更新时间:2023-11-30 18:18:03 25 4
gpt4 key购买 nike

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

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,但它失败了:

An unhandled exception of type 'System.InvalidCastException' occurred in myApp.exe

Additional information: Unable to cast object of type 'System.String' to type '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 字符串,但当然也失败了。

在分配给设置属性之前如何转换像这样的 XML 字符串?我需要做什么才能完成这项工作?

最佳答案

没有人吗?太糟糕了,我本以为会有更优雅的解决方案...

所以我现在正在使用它:

  1. 检查设置的Type是否为StringCollection

  2. 读出“ArrayOfString/string”处的 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 一样获取默认值的方法。我无法想象它会像这样骇人听闻,对吧?

关于c# - 在 Visual Studio .NET 中获取用户设置集合类型的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42318809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com