/// <summary>
        /// Returns the properties defined on the given type.
        /// </summary>
        /// <param name="type">The type for which to return the properties.</param>
        /// <returns></returns>
        public IEnumerable <PropertyDocumentation> GetProperties(TypeDocumentation type)
        {
            var fullName = type.Member.FullName;
            var nodes    = this.Document.DocumentElement.SelectNodes($"members/member[starts-with(@name, 'P:{fullName}.')]");

            foreach (XmlNode node in nodes)
            {
                var nameAttribute = node.Attributes["name"].Value;

                var name = nameAttribute;
                if (name.Contains('('))
                {
                    name = name.Substring(0, name.IndexOf('('));
                }
                name = name.Substring(name.LastIndexOf('.') + 1);

                var prop = type.Member.GetProperties().Where(x => x.Name == name).Where(x => x.DeclaringType == type.Member).FirstOrDefault();

                if (null != prop)
                {
                    yield return(new PropertyDocumentation(node, prop));
                }
            }
            yield break;
        }
        /// <summary>
        /// Returns the methods for the given <paramref name="type"/>.
        /// </summary>
        /// <param name="type">The type for which to return the methods.</param>
        public IEnumerable <MethodDocumentation> GetMethods(TypeDocumentation type)
        {
            if (null == type)
            {
                throw new ArgumentNullException(nameof(type));
            }

            var nodes = this.Document.DocumentElement.SelectNodes($"members/member[starts-with(@name, 'M:{type.Member.FullName}.')]");

            foreach (XmlNode node in nodes)
            {
                MethodBase method = null;
                var        cref   = new CRef(node.Attributes["name"].Value);
                if (cref.IsMethod)
                {
                    method = cref.ToMethod();
                }

                if (null != method)
                {
                    yield return(new MethodDocumentation(node, method));
                }
            }
            yield break;
        }
        /// <summary>
        /// Returns the events for the given type.
        /// </summary>
        /// <param name="type">The type to return the events for.</param>
        public IEnumerable <EventDocumentation> GetEvents(TypeDocumentation type)
        {
            var nodes = this.Document.DocumentElement.SelectNodes($"members/member[starts-with(@name, 'E:{type.Member.FullName}.')]");

            foreach (XmlNode node in nodes)
            {
                var nameAttribute = node.Attributes["name"].Value;
                var name          = nameAttribute.Substring(nameAttribute.LastIndexOf('.') + 1);
                var eInfo         = type.Member.GetEvent(name);
                if (null != eInfo)
                {
                    yield return(new EventDocumentation(node, eInfo));
                }
            }
            yield break;
        }
 /// <summary>
 /// Returns the member documentation for the given type.
 /// </summary>
 /// <param name="type">The type to return the members for.</param>
 public IEnumerable <MemberDocumentation> GetMembers(TypeDocumentation type)
 {
     foreach (var m in this.GetFields(type))
     {
         yield return(m);
     }
     foreach (var m in this.GetProperties(type))
     {
         yield return(m);
     }
     foreach (var m in this.GetMethods(type))
     {
         yield return(m);
     }
     foreach (var m in this.GetEvents(type))
     {
         yield return(m);
     }
 }