Nachdem mich am Donnerstag ein Virus dahin gerafft hat und ich das Bett hüten durfte, soll es heute wieder was neues geben.
Häufig hat man es mit XML-Daten zu tun, welche ausgelesen und bearbeitet werden sollen. Die enthaltenen Daten sind oft von einem bestimmten Typ. Die nachfolgende Hilfsklasse stellt Schnittstellen zur Verfügung, um die notwendigen Typumwandlungen zu kapseln. Diese Variante funktioniert nur mit Typen welche IConvertible implementieren. Eine Erweiterung, welche diese Einschränkung nicht besitzt, gibt es morgen. :)
using System.Xml;
using System;
namespace de.wwaitz.Utils.XmlHelper
{
public class NodeHelper
{
/// <summary>
/// Gets a value indicating whether T is convertible.
/// </summary>
/// <value>
/// <c>true</c> if T is convertible; otherwise, <c>false</c>.
/// </value>
public static bool IsConvertible(Type resultType)
{
return typeof(IConvertible).IsAssignableFrom(resultType);
}
/// <summary>
/// Gets the value.
/// </summary>
/// <param name="node">The node.</param>
/// <param name="@default">The @default.</param>
/// <returns></returns>
public static T GetValue<T>(XmlNode node, T @default)
{
T result = @default;
if(node == null) {
//invalid node
return result;
}
if(!IsConvertible(typeof(T))) {
//cast is not possible
return result;
}
//get value
string toGet = node.InnerText;
//convert to T
result = (T)Convert.ChangeType(toGet, typeof(T));
return result;
}
/// <summary>
/// Sets the value.
/// </summary>
/// <param name="node">The node.</param>
/// <param name="value">The value.</param>
public static void SetValue<T>(XmlNode node, T value)
{
if(node == null) {
//invalid node
return;
}
if(!IsConvertible(typeof(T))) {
//cast is not possible
return;
}
string toSet = Convert.ToString(value);
node.InnerText = toSet;
}
}
}
Die Verwendung könnte dann wie folgt aussehen:
internal class Program
{
private static void Main(string[] args)
{
string xml = "<root><my-bool>true</my-bool></root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
bool myBool = NodeHelper.GetValue<bool>(doc.DocumentElement["my-bool"], false);
NodeHelper.SetValue<bool>(doc.DocumentElement["my-bool"], !myBool);
}
}