C# 如何在设置中存储词典
我正在尝试编写一个通用字典,它可以存储在app.config或web.config文件中。按照中的示例,我编写了一本字典,但做了一些更改:C# 如何在设置中存储词典,c#,xml,app-config,C#,Xml,App Config,我正在尝试编写一个通用字典,它可以存储在app.config或web.config文件中。按照中的示例,我编写了一本字典,但做了一些更改: 我使用了更现代的System.Xml.LinqAPI 我使用了一个哈希表,它允许我存储任何类型的值,只要它是可序列化的,而不仅仅是字符串 [SettingsSerializeAs(SettingsSerializeAs.Xml)] 公共类XmlSerializableDictionary:哈希表,IXmlSerializable { #区域构造函数 ///
System.Xml.Linq
API[SettingsSerializeAs(SettingsSerializeAs.Xml)]
公共类XmlSerializableDictionary:哈希表,IXmlSerializable
{
#区域构造函数
///
///初始化的新实例。
///
公共XmlSerializableDictionary()
{
}
#端区
#区域IXmlSerializable成员
///
公共XmlSchema GetSchema()
{
返回null;
}
///
公共void ReadXml(XmlReader)
{
XDocument xdoc=XDocument.Load(读卡器);
foreach(xdoc.Elements()中的XElement条目)
{
XElement key=entry.Element(nameof(DictionaryEntry.key))
?抛出新的FormatException($“{nameof(DictionaryEntry.Key)}在条目中丢失”);
XElement valueElement=entry.Element(nameof(DictionaryEntry.Value))
?抛出新的FormatException($“{nameof(DictionaryEntry.Value)}元素在条目中丢失”);
XAttribute valueTypeName=valueElement?.Attribute(“type”)??抛出新的FormatException({nameof(DictionaryEntry.Value)}元素中缺少$”type属性);
如果(valueTypeName.Value==“null”)
{
此[key.Value]=null;
}
其他的
{
类型valueType=Type.GetType(valueTypeName.Value);
XmlSerializer XmlSerializer=新XmlSerializer(valueType??抛出新ArgumentException(“类型属性值不是有效的类型名”);
对象值=xmlSerializer.Deserialize(valueElement.CreateReader());
此[key.Value]=值;
}
}
}
///
public void WriteXml(XmlWriter)
{
XDocument xdoc=新的XDocument();
Add(新的XElement(nameof(XmlSerializableDictionary));
foreach(字典在此输入条目)
{
Type valueType=entry.Value?.GetType();
字符串typeName=valueType==null?“null”:$“{valueType.FullName},{valueType.Assembly.GetName().Name}”;
对象值=空;
if(valueType!=null)
{
XmlSerializer XmlSerializer=新的XmlSerializer(valueType);
使用(MemoryStream stream=new MemoryStream())
{
serializer.Serialize(流,entry.Value);
使用(StreamReader=新StreamReader(stream))
{
stream.Seek(0,SeekOrigin.Begin);
String xmlString=reader.ReadToEnd();
XElement valueXml=XElement.Load(xmlString);
value=valueXml;
}
}
}
XElement entryElement=新XElement(名称)(字典入口),
新元素(名称(DictionaryEntry.Key),
新XAttribute(“type”,typeName),
entry.Key.ToString()),
新的XElement(nameof(DictionaryEntry.Value),Value));
xdoc.Root?.Add(entryElement);
}
}
#端区
///
公共覆盖无效添加(对象键、对象值)
{
如果(!(键为字符串))
{
抛出新的NotSupportedException($“{nameof(key)}必须是字符串。”);
}
添加(键、值);
}
}
所需的XML架构应为
<XmlSerializableDictionary>
<DictionaryEntry>
<Key>Key1</Key>
<Value type="System.Int32"> <!-- example type-->
Value1
</Value>
</DictionaryEntry>
<!--other entries here -->
</XmlSerializableDictionary>
关键1
价值1
但是,在设置设计器中添加此类型的设置和示例值后,该设置不会写入实现该设置的类库的app.config文件。有什么我遗漏的吗
更新
我更新了上述XML,如下所示,但仍然不起作用:
关键1
42
尝试将流
传递给类似XmlReader的用户
if (valueType != null)
{
XmlSerializer xmlSerializer = new XmlSerializer(valueType);
using (MemoryStream stream = new MemoryStream())
{
xmlSerializer.Serialize(stream, entry.Value);
stream.Position = 0;
using (XmlReader reader = XmlReader.Create(stream))
{
XElement valueXml = XElement.Load(reader);
value = valueXml;
}
}
}
尝试将
流
传递给XmlReader
if (valueType != null)
{
XmlSerializer xmlSerializer = new XmlSerializer(valueType);
using (MemoryStream stream = new MemoryStream())
{
xmlSerializer.Serialize(stream, entry.Value);
stream.Position = 0;
using (XmlReader reader = XmlReader.Create(stream))
{
XElement valueXml = XElement.Load(reader);
value = valueXml;
}
}
}
好电话。我无法让一个字符串数组工作,即使它有一个类型。@TaW StringCollection在这方面效果很好。经过数小时令人沮丧的工作后,我放弃了这项工作,转而将字符串数组填充到一个字符串中。嗯。我想看一个实际可行的例子。我所发现的(经常是相互冲突的)帖子展示了人们应该使用的各种技巧。这里一个都不起作用:-(很好的调用。我无法让一个字符串数组工作,即使它有一个类型。@TaW StringCollection在这方面工作得很好。在数小时令人沮丧的工作之后,我放弃了这项工作,转而将字符串数组填充到一个字符串中。Duh。我想看看一个实际工作的示例。我所发现的是(经常相互冲突)显示各种技巧(!)的帖子。此处没有一个有效:-(仍然无效。还尝试使用另一个项目中的类型。这次该类型显示在“浏览…”选项,但仍不起作用。仍不起作用。还尝试使用其他项目中的类型。这次该类型显示在“浏览…”选项中,但仍不起作用。