我即将开始编写新的应用程序,我想弄清楚如何存储设置。我几乎考虑编写自己的设置系统但后来决定我应该完全测试.NET提供的构建application settings。所以我读了一下它并创建了一些测试代码。它很顺利,我想要的主要方法是重置值,它可以轻松完成,但我想这样做而不会自动将重置保存到设置文件。
所以我创建了以下代码,它循环遍历设置类的每个属性并使用默认值 值以更新当前值。
foreach (SettingsProperty sp in Settings.Default.Properties)
{
PropertyInfo propertyInfo = Settings.Default.GetType().GetProperty(sp.Name);
if (propertyInfo.CanWrite)
{
// Either convert from a string or de-serialize from XML
object value;
switch (sp.SerializeAs)
{
case SettingsSerializeAs.String:
TypeConverter converter = TypeDescriptor.GetConverter(sp.PropertyType);
value = converter.ConvertFromInvariantString(sp.DefaultValue.ToString());
break;
case SettingsSerializeAs.Xml:
XmlSerializer serializer = new XmlSerializer(sp.PropertyType);
StringReader reader = new StringReader(sp.DefaultValue.ToString());
value = serializer.Deserialize(reader);
break;
default:
throw new FormatException(
string.Format(
Resources.ExceptionResetNoSaveSerializeAsInvalid,
sp.SerializeAs));
}
propertyInfo.SetValue(Settings.Default, value, null);
}
}
我开始没有switch
,只有从字符串转换的代码。我的第一次尝试使用了这个:converter.ConvertFromString
。这只适用于纯文本甚至GUID值,但是日期失败了
(我添加的XML部分使得序列化内容也起作用,但这不是这个问题的焦点)
原始converter.ConvertFromString
日期失败。在我的测试中,我使用的是'31 / 08/2012 11:25'。我一直在查看Settings.Designer.cs文件,看看它存储默认值的位置和方式,并注意到它是如何存储上述日期的默认值:
[global::System.Configuration.DefaultSettingValueAttribute("08/31/2012 11:25:15")]
我一直在网上搜索但是我找不到任何参考来解释为什么在Visual Studio 2010设计器中输入dd / mm / yyyy格式导致在自动生成的代码中使用mm / dd / yyyy格式。
正如您在上面的示例中所看到的,我发现我可以使用converter.ConvertFromInvariantString
并且日期错误确实消失但我仍然想知道是否有任何文档来解释这些差异。还有其他人遇到过这个吗?
答案 0 :(得分:0)
是和否。内部使用不变的文化。虽然这是一种特定的文化,但它显然不是一种真正的文化。
在内部,它使用TypeConverter.ConvertToInvariantString
和TypeConverter.ConvertFromInvariantString
等方法来获取字符串中的值。这就是弦乐中mm / dd / yyy的原因。当您在UI中输入日期/时间时,它知道当地文化是什么,并以适合该文化的任何格式接受它。然后"转换"在存储它时保持不变。这样做是因为它在读取值时不知道将要设置什么文化。它默认为不变,因为这是一种特定且一致的文化。
就DateTime
而言,这既不会导致UTC也不会导致本地日期/时间。这允许您存储UTC或本地日期/时间值,您需要"转换"到具有特定Kind属性的DateTime
对象设置为您需要的任何对象。建议您将日期/时间值存储在UTC ...