Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Based on <a href="https://stackoverflow.com/questions/230925/retrieve-xml-doc-comments-programmatically#231005">Ilya's response</a>:</p> <p><strong>Find xml</strong></p> <p><a href="http://msdn.microsoft.com/en-us/library/sb6a8618.aspx#cpconpackagingdeployingresourcesanchor1" rel="nofollow noreferrer">.NET fallback locations</a> (ignoring GAC and other irrelevant subdirectories)</p> <pre><code>static FileInfo GetXmlDocFile( Assembly assembly ) { string assemblyDirPath = Path.GetDirectoryName( assembly.Location ); string fileName = Path.GetFileNameWithoutExtension( assembly.Location ) +".xml"; return GetFallbackDirectories( CultureInfo.CurrentCulture ) .Select( dirName =&gt; CombinePath( assemblyDirPath, dirName, fileName ) ) .Select( filePath =&gt; new FileInfo( filePath ) ) .Where( file =&gt; file.Exists ) .First( ); } static IEnumerable&lt;string&gt; GetFallbackDirectories( CultureInfo culture ) { return culture .Enumerate( c =&gt; c.Parent.Name != c.Name ? c.Parent : null ) .Select( c =&gt; c.Name ); } static IEnumerable&lt;T&gt; Enumerate&lt;T&gt;( this T start, Func&lt;T, T&gt; next ) { for( T item = start; !object.Equals( item, default(T) ); item = next( item ) ) yield return item; } static string CombinePath( params string[] args ) { return args.Aggregate( Path.Combine ); } </code></pre> <p><strong>Find element</strong></p> <p><a href="http://msdn.microsoft.com/en-us/library/fsbx0t7x.aspx" rel="nofollow noreferrer">Processing XML Documentation</a></p> <pre><code>static XElement GetDocMember( XElement docMembers, MemberInfo member ) { string memberId = GetMemberId( member ); return docMembers.Elements( "member" ) .Where( e =&gt; e.Attribute( "name" ).Value == memberId ) .First( ); } static string GetMemberId( MemberInfo member ) { char memberKindPrefix = GetMemberPrefix( member ); string memberName = GetMemberFullName( member ); return memberKindPrefix + ":" + memberName; } static char GetMemberPrefix( MemberInfo member ) { return member.GetType( ).Name .Replace( "Runtime", "" )[0]; } static string GetMemberFullName( MemberInfo member ) { string memberScope = ""; if( member.DeclaringType != null ) memberScope = GetMemberFullName( member.DeclaringType ); else if( member is Type ) memberScope = ((Type)member).Namespace; return memberScope + "." + member.Name; } </code></pre> <p><strong>Example use</strong></p> <pre><code>Type type = typeof( string ); var file = GetXmlDocFile( type.Assembly ); var docXml = XDocument.Load( file.FullName ); var docMembers = docXml.Root.Element( "members" ); var member = type.GetProperty( "Length" ); var docMember = GetDocMember( docMembers, member ); </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload