CheckStruct.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using CommonLang.Property;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Text;
  7. namespace CommonLang.CheckCode
  8. {
  9. public class CheckCodeStruct
  10. {
  11. class CodeStructNode
  12. {
  13. internal Type MemberType
  14. {
  15. get
  16. {
  17. if (Member is FieldInfo)
  18. {
  19. return (Member as FieldInfo).FieldType;
  20. }
  21. if (Member is PropertyInfo)
  22. {
  23. return (Member as PropertyInfo).PropertyType;
  24. }
  25. return null;
  26. }
  27. }
  28. internal readonly Type OwnerType;
  29. internal readonly MemberInfo Member;
  30. internal CodeStructNode(Type ownerType, MemberInfo member)
  31. {
  32. this.OwnerType = ownerType;
  33. this.Member = member;
  34. }
  35. }
  36. public Type BaseType { get; private set; }
  37. public Type[] DeclaredTypes { get; private set; }
  38. private List<CodeStructNode> StructNodes = new List<CodeStructNode>();
  39. public CheckCodeStruct(Type baseType, params Type[] declears)
  40. {
  41. this.BaseType = baseType;
  42. this.DeclaredTypes = declears;
  43. foreach (Type subtype in ReflectionUtil.GetSubTypes(baseType))
  44. {
  45. foreach (FieldInfo field in subtype.GetFields())
  46. {
  47. if (IsDeclaredType(field.FieldType))
  48. {
  49. StructNodes.Add(new CodeStructNode(subtype, field));
  50. }
  51. }
  52. foreach (PropertyInfo prop in subtype.GetProperties())
  53. {
  54. if (IsDeclaredType(prop.PropertyType))
  55. {
  56. StructNodes.Add(new CodeStructNode(subtype, prop));
  57. }
  58. }
  59. }
  60. }
  61. public bool IsDeclaredType(Type type)
  62. {
  63. foreach (Type de in DeclaredTypes)
  64. {
  65. if (de.IsAssignableFrom(type))
  66. {
  67. return true;
  68. }
  69. }
  70. return false;
  71. }
  72. public string GenInfo()
  73. {
  74. StringBuilder sb = new StringBuilder();
  75. foreach (CodeStructNode node in StructNodes)
  76. {
  77. sb.AppendLine(node.OwnerType.FullName);
  78. sb.AppendLine("\t" + node.Member.Name + " : " + node.MemberType.Name);
  79. }
  80. return sb.ToString();
  81. }
  82. }
  83. }