private static void EvaluateProperties(BaseDocument document, XPath root, object obj) { foreach (PropertyInfo property in obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) { XPath xpath = XPathForProperty(root, property); if (property.PropertyType.GetInterfaces().Any(t => t == typeof(INode))) { var node = Activator.CreateInstance(property.PropertyType); EvaluateProperties(document, xpath, node); property.SetValue(obj, node); } else { var value = document.Evaluate(xpath, property.PropertyType) ?? document.Evaluate(xpath.ToCamelCase(), property.PropertyType); property.SetValue(obj, value); } } }