Advertisement
Bunny83

ComponentDatabase.cs

Sep 7th, 2018
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.13 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public static class ComponentDatabase
  6. {
  7.     public class TypeNode : IEnumerable<System.Type>
  8.     {
  9.         public System.Type type;
  10.         public TypeNode next = null;
  11.         public IEnumerator<System.Type> GetEnumerator()
  12.         {
  13.             for (var t = this; t != null; t = t.next)
  14.                 yield return t.type;
  15.         }
  16.         IEnumerator IEnumerable.GetEnumerator()
  17.         {
  18.             return GetEnumerator();
  19.         }
  20.     }
  21.     private static List<System.Type> m_Types;
  22.     private static Dictionary<string, TypeNode> m_Dict;
  23.     static ComponentDatabase()
  24.     {
  25.         var comp = typeof(Component);
  26.         var hashset = new HashSet<System.Type>();
  27.         m_Dict = new Dictionary<string, TypeNode>();
  28.         foreach (var a in System.AppDomain.CurrentDomain.GetAssemblies())
  29.         {
  30.             foreach (var t in a.GetTypes())
  31.             {
  32.                 if (comp.IsAssignableFrom(t) && !t.IsAbstract && !hashset.Contains(t) && t != comp)
  33.                 {
  34.                     hashset.Add(t);
  35.                     TypeNode tn = null;
  36.                     m_Dict.TryGetValue(t.Name, out tn);
  37.                     tn = new TypeNode { next = tn, type = t };
  38.                     m_Dict[t.Name] = tn;
  39.                 }
  40.             }
  41.         }
  42.         m_Types = new List<System.Type>(hashset.Count);
  43.         m_Types.AddRange(hashset);
  44.     }
  45.     public static TypeNode FindComponent(string aComponentName)
  46.     {
  47.         TypeNode tn;
  48.         if (m_Dict.TryGetValue(aComponentName, out tn))
  49.             return tn;
  50.         return null;
  51.     }
  52.     public static List<System.Type> GetTypes(System.Type aBaseType)
  53.     {
  54.         var res = new List<System.Type>();
  55.         foreach (var t in m_Types)
  56.         {
  57.             if (aBaseType.IsAssignableFrom(t))
  58.                 res.Add(t);
  59.         }
  60.         return res;
  61.     }
  62.     public static List<System.Type> GetTypes<T>()
  63.     {
  64.         return GetTypes(typeof(T));
  65.     }
  66.     public static IEnumerable<System.Type> GetAllTypes()
  67.     {
  68.         return m_Types.AsReadOnly();
  69.     }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement