void IXmlSerializable.ReadXml(XmlReader reader)
 {
     // for the `decodeName` delegate, you could check that the node name matches the pattern "rateN" for some integer N, if you want.
     XmlKeyValueListHelper.ReadXml(reader, this, null, s => new Rate {
         RateValue = s
     });
 }
 void IXmlSerializable.WriteXml(XmlWriter writer)
 {
     XmlKeyValueListHelper.WriteXml(writer, this, (i, rate) => "rate" + XmlConvert.ToString(i), r => r.RateValue);
 }
    public void WriteXml(XmlWriter writer)
    {
        var converter = TypeDescriptor.GetConverter(typeof(TValue));

        XmlKeyValueListHelper.WriteXml(writer, this, converter);
    }
    public void ReadXml(XmlReader reader)
    {
        var converter = TypeDescriptor.GetConverter(typeof(TValue));

        XmlKeyValueListHelper.ReadXml(reader, this, converter);
    }