C# 如何在设置中存储词典

C# 如何在设置中存储词典,c#,xml,app-config,C#,Xml,App Config,我正在尝试编写一个通用字典,它可以存储在app.config或web.config文件中。按照中的示例,我编写了一本字典,但做了一些更改: 我使用了更现代的System.Xml.LinqAPI 我使用了一个哈希表,它允许我存储任何类型的值,只要它是可序列化的,而不仅仅是字符串 [SettingsSerializeAs(SettingsSerializeAs.Xml)] 公共类XmlSerializableDictionary:哈希表,IXmlSerializable { #区域构造函数 ///

我正在尝试编写一个通用字典,它可以存储在app.config或web.config文件中。按照中的示例,我编写了一本字典,但做了一些更改:

  • 我使用了更现代的
    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。我想看看一个实际工作的示例。我所发现的是(经常相互冲突)显示各种技巧(!)的帖子。此处没有一个有效:-(仍然无效。还尝试使用另一个项目中的类型。这次该类型显示在“浏览…”选项,但仍不起作用。仍不起作用。还尝试使用其他项目中的类型。这次该类型显示在“浏览…”选项中,但仍不起作用。