XmlDocFinder.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Xml.Linq;
  8. using System.Xml.XPath;
  9. namespace EfDbCommentGenerator.Core
  10. {
  11. internal class XmlDocFinder
  12. {
  13. private readonly Dictionary<string, XDocument> _dicXml;
  14. public XmlDocFinder()
  15. {
  16. _dicXml = new Dictionary<string, XDocument>();
  17. }
  18. private XDocument GetXml(Assembly assembly)
  19. {
  20. var xmlFilePath = Path.ChangeExtension(assembly.Location, "xml");
  21. if (_dicXml.ContainsKey(xmlFilePath)) return _dicXml[xmlFilePath];
  22. XDocument load = null;
  23. try
  24. {
  25. load = XDocument.Load(xmlFilePath);
  26. }
  27. catch (Exception ex)
  28. {
  29. Debug.Print(ex.ToString());
  30. }
  31. return _dicXml[xmlFilePath] = load;
  32. }
  33. public string FindDoc(MemberInfo member)
  34. {
  35. var xml = GetXml(member.Module.Assembly);
  36. if (xml == null) return null;
  37. Type identityType;
  38. switch (member.MemberType)
  39. {
  40. case MemberTypes.TypeInfo:
  41. case MemberTypes.NestedType:
  42. return xml.XPathSelectElement($"/doc/members/member[@name=\"T:{((Type)member).FullName.Replace("+", ".")}\"]/summary")?.Value.Trim();
  43. case MemberTypes.Field:
  44. var fi = (FieldInfo)member;
  45. identityType = fi.ReflectedType;
  46. if (identityType != null && identityType.IsGenericType && false == identityType.IsGenericTypeDefinition)
  47. {
  48. identityType = identityType.GetGenericTypeDefinition();
  49. }
  50. Debug.Assert(identityType != null, "t != null");
  51. return xml.XPathSelectElement($"/doc/members/member[@name=\"F:{identityType.FullName.Replace("+", ".")}.{fi.Name}\"]/summary")?.Value.Trim();
  52. case MemberTypes.Property:
  53. var pi = (PropertyInfo)member;
  54. if (pi.ReflectedType != pi.DeclaringType && pi.DeclaringType != null)
  55. {
  56. var findDoc = FindDoc(pi.DeclaringType.GetProperty(pi.Name));
  57. return findDoc;
  58. }
  59. string additionalComment = null;
  60. if (pi.PropertyType.IsEnum)
  61. {
  62. additionalComment += FindDoc(pi.PropertyType)
  63. + "("
  64. + string.Join(",", Enum.GetValues(pi.PropertyType).Cast<object>().Select(p => pi.PropertyType.GetField(p.ToString())).Select(p => Convert.ToInt64(p.GetRawConstantValue()) + ":" + FindDoc(p)))
  65. + ")";
  66. }
  67. identityType = pi.ReflectedType;
  68. if (identityType != null && identityType.IsGenericType && false == identityType.IsGenericTypeDefinition)
  69. {
  70. identityType = identityType.GetGenericTypeDefinition();
  71. }
  72. Debug.Assert(identityType != null, "t != null");
  73. return xml.XPathSelectElement($"/doc/members/member[@name=\"P:{identityType.FullName.Replace("+", ".")}.{pi.Name}\"]/summary")?.Value.Trim()
  74. + additionalComment;
  75. case MemberTypes.Constructor:
  76. case MemberTypes.Event:
  77. case MemberTypes.Method:
  78. case MemberTypes.Custom:
  79. case MemberTypes.All:
  80. default:
  81. return null;
  82. }
  83. }
  84. }
  85. }