Vadim’s Weblog

Never stop learning.

GetAttribute Generics way.

Posted by Vadim on March 26, 2008

As developers we often need to work with Xml.  In my case I found myself writing code like this one:
   1: public void Main()
   2: {
   3:   string name;
   4:   bool required;
   5:   XmlDocument _xmlDoc = new XmlDocument();
   6:   _xmlDoc.LoadXml("<column name=\"colName\" required=\"true\"/>");
   7:   if (_xmlDoc.DocumentElement.HasAttribute("name"))
   8:     name = _xmlDoc.DocumentElement.GetAttribute("name");
   9:   if (_xmlDoc.DocumentElement.HasAttribute("required"))
  10:     required = Convert.ToBoolean(_xmlDoc.DocumentElement.GetAttribute("required"));
  11: }
I hated the fact that I have to for every attribute use two lines in my Main function.  Below you can see refactored code.
 
Note: You will need to pass XmlNamespaceManager if you’re using namespaces.
   1: public void Main()
   2: {
   3:   XmlDocument _xmlDoc = new XmlDocument();
   4:   _xmlDoc.LoadXml("<column name=\"colName\" required=\"true\"/>");
   5:   string name = GetAttribute<string>(_xmlDoc.DocumentElement, "name");
   6:   bool required = GetAttribute<bool>(_xmlDoc.DocumentElement, "required");
   7: }
   1: private T GetAttribute<T>(XmlElement columnElement, string attributeName)
   2:   where T : IConvertible
   3: {
   4:   if (columnElement.HasAttribute(attributeName))
   5:     return (T) Convert.ChangeType(columnElement.GetAttribute(attributeName), typeof (T));
   6:   return default(T);
   7: }
I hope you’ll find it useful.

kick it on DotNetKicks.com

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>