DynamicManager.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using Island.StandardLib.Reflection.Exception;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Text;
  7. namespace Island.StandardLib.Reflection
  8. {
  9. public class DynamicManager
  10. {
  11. List<string> namespaces;
  12. List<Assembly> assemblies;
  13. Dictionary<string, DynamicType> cachedTypes;
  14. public DynamicManager()
  15. {
  16. namespaces = new List<string>();
  17. assemblies = new List<Assembly>();
  18. cachedTypes = new Dictionary<string, DynamicType>();
  19. namespaces.Add("");
  20. }
  21. public void LoadCurrentDomainEnvironment()
  22. {
  23. foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
  24. AddAssembly(assembly);
  25. }
  26. public void AddNamespace(string @namespace)
  27. {
  28. if (!namespaces.Contains(@namespace + "."))
  29. namespaces.Add(@namespace + ".");
  30. }
  31. public void AddAssembly(Assembly assembly)
  32. {
  33. if (!assemblies.Contains(assembly))
  34. assemblies.Add(assembly);
  35. }
  36. public DynamicClassInstance<T>[] ScanAssembly<T>(Assembly assembly, params object[] initargs) where T : class
  37. {
  38. AddAssembly(assembly);
  39. Type[] types = assembly.GetTypes();
  40. types = (from type in types
  41. where type.IsSubclassOf(typeof(T))
  42. select type).ToArray();
  43. return types.Do(t => new DynamicClassInstance<T>(this, GetDynamicType(t), initargs));
  44. }
  45. public DynamicType GetDynamicType(Type existType)
  46. {
  47. if (cachedTypes.TryGetValue(existType.FullName, out DynamicType result)) return result;
  48. DynamicType dtype = new DynamicType(existType);
  49. cachedTypes.Add(existType.FullName, dtype);
  50. return dtype;
  51. }
  52. public DynamicType GetDynamicType(string className)
  53. {
  54. foreach (string @namespace in namespaces)
  55. {
  56. string trying = @namespace + className;
  57. if (cachedTypes.TryGetValue(trying, out DynamicType type)) return type;
  58. }
  59. for (int i = 0; i < assemblies.Count; i++)
  60. {
  61. for (int j = 0; j < namespaces.Count; j++)
  62. {
  63. string lpfullname = namespaces[j] + className;
  64. Type typed = assemblies[i].GetType(lpfullname, false);
  65. if (typed != null)
  66. {
  67. DynamicType dtype = new DynamicType(typed);
  68. cachedTypes.Add(lpfullname, dtype);
  69. return dtype;
  70. }
  71. }
  72. }
  73. throw new ClassNotFoundException(className);
  74. }
  75. public DynamicClassInstance CreateClassInstance(string className, params object[] initargs)
  76. {
  77. return new DynamicClassInstance(this, GetDynamicType(className), initargs);
  78. }
  79. }
  80. }