diff --git a/CHANGELOG.md b/CHANGELOG.md index acc317f..23745c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Added MathUtils methods for converting to and from percentages - Added enum extensions for finding the inclusion and exclusion of enum flags - Added DateTime extensions for adding years, months, days, hours, minutes and wrapping without modifying other values + - Added shims for deserializing an XML array using a callback for each item ## [10.2.0] - 2019-12-04 ### Added diff --git a/ICD.Common.Utils/Xml/IcdXmlConvert.cs b/ICD.Common.Utils/Xml/IcdXmlConvert.cs index 5cc796a..7e97934 100644 --- a/ICD.Common.Utils/Xml/IcdXmlConvert.cs +++ b/ICD.Common.Utils/Xml/IcdXmlConvert.cs @@ -128,6 +128,24 @@ namespace ICD.Common.Utils.Xml return DeserializeArray(typeof(T), reader).Cast(); } + /// + /// Deserializes the child elements as items in an array. + /// + /// + /// + /// + /// + public static IEnumerable DeserializeArray(IcdXmlReader reader, Func deserializeItem) + { + if (reader == null) + throw new ArgumentNullException("reader"); + + if (deserializeItem == null) + throw new ArgumentNullException("deserializeItem"); + + return DeserializeArray(typeof(T), reader, r => deserializeItem(r)).Cast(); + } + /// /// Deserializes the child elements as items in an array. /// @@ -135,6 +153,26 @@ namespace ICD.Common.Utils.Xml /// /// public static IEnumerable DeserializeArray(Type type, IcdXmlReader reader) + { + if (type == null) + throw new ArgumentNullException("type"); + + if (reader == null) + throw new ArgumentNullException("reader"); + + IXmlConverter converter = XmlConverterAttribute.GetConverterForType(type); + + return DeserializeArray(type, reader, r => converter.ReadXml(r)); + } + + /// + /// Deserializes the child elements as items in an array. + /// + /// + /// + /// + /// + public static IEnumerable DeserializeArray(Type type, IcdXmlReader reader, Func deserializeItem) { if (type == null) throw new ArgumentNullException("type"); @@ -158,10 +196,9 @@ namespace ICD.Common.Utils.Xml yield break; // Read the items - IXmlConverter converter = XmlConverterAttribute.GetConverterForType(type); while (reader.NodeType != XmlNodeType.EndElement) { - yield return converter.ReadXml(reader); + yield return deserializeItem(reader); reader.SkipInsignificantWhitespace(); }