Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
TypeCache.cs
浏览该文件的文档.
1using System.Reflection;
2
3namespace Engine.Serialization {
4 public static class TypeCache {
5 public static Dictionary<string, Type> m_typesByName;
6
7 public static Dictionary<string, string> m_shortToLong;
8
9 public static Dictionary<string, string> m_longToShort;
10
11 public static List<Assembly> m_loadedAssemblies;
12
13 public static bool m_rescanAssemblies;
14
15 public static ReadOnlyList<Assembly> LoadedAssemblies {
16 get {
17 lock (m_typesByName) {
19 m_loadedAssemblies = new List<Assembly>(AppDomain.CurrentDomain.GetAssemblies());
20 m_rescanAssemblies = false;
21 }
22 return new ReadOnlyList<Assembly>(m_loadedAssemblies);
23 }
24 }
25 }
26
27 static TypeCache() {
28 m_typesByName = [];
29 m_shortToLong = [];
30 m_longToShort = [];
32 m_rescanAssemblies = true;
33 AddShortTypeName("bool", typeof(bool).FullName);
34 AddShortTypeName("sbyte", typeof(sbyte).FullName);
35 AddShortTypeName("byte", typeof(byte).FullName);
36 AddShortTypeName("short", typeof(short).FullName);
37 AddShortTypeName("ushort", typeof(ushort).FullName);
38 AddShortTypeName("int", typeof(int).FullName);
39 AddShortTypeName("uint", typeof(uint).FullName);
40 AddShortTypeName("long", typeof(long).FullName);
41 AddShortTypeName("ulong", typeof(ulong).FullName);
42 AddShortTypeName("float", typeof(float).FullName);
43 AddShortTypeName("double", typeof(double).FullName);
44 AddShortTypeName("char", typeof(char).FullName);
45 AddShortTypeName("string", typeof(string).FullName);
46 AddShortTypeName("Vector2", typeof(Vector2).FullName);
47 AddShortTypeName("Vector3", typeof(Vector3).FullName);
48 AddShortTypeName("Vector4", typeof(Vector4).FullName);
49 AddShortTypeName("Quaternion", typeof(Quaternion).FullName);
50 AddShortTypeName("Matrix", typeof(Matrix).FullName);
51 AddShortTypeName("Color", typeof(Color).FullName);
52 AddShortTypeName("Point2", typeof(Point2).FullName);
53 AddShortTypeName("Point3", typeof(Point3).FullName);
54 AddShortTypeName("Rectangle", typeof(Rectangle).FullName);
55 AddShortTypeName("Box", typeof(Box).FullName);
56 AddShortTypeName("BoundingRectangle", typeof(BoundingRectangle).FullName);
57 AddShortTypeName("BoundingBox", typeof(BoundingBox).FullName);
58 AddShortTypeName("BoundingCircle", typeof(BoundingCircle).FullName);
59 AddShortTypeName("BoundingSphere", typeof(BoundingSphere).FullName);
60 AddShortTypeName("Plane", typeof(Plane).FullName);
61 AddShortTypeName("Ray2", typeof(Ray2).FullName);
62 AddShortTypeName("Ray3", typeof(Ray3).FullName);
63 AppDomain.CurrentDomain.AssemblyLoad += delegate {
64 lock (m_typesByName) {
65 m_rescanAssemblies = true;
66 }
67 };
68 }
69
70 public static bool IsKnownSystemAssembly(Assembly assembly) {
71 string text = assembly.FullName.ToLower();
72 if (text.Contains("b77a5c561934e089")) {
73 return true;
74 }
75 if (text.Contains("31bf3856ad364e35")) {
76 return true;
77 }
78 if (text.Contains("b03f5f7f11d50a3a")) {
79 return true;
80 }
81 if (text.Contains("89845dcd8080cc91")) {
82 return true;
83 }
84 return text.Contains("opentk") || text.Contains("sharpdx");
85 }
86
87 public static Type FindType(string typeName, bool skipSystemAssemblies, bool throwIfNotFound) {
88 lock (m_typesByName) {
89 if (!m_typesByName.TryGetValue(typeName, out Type value)) {
90 string longTypeName = GetLongTypeName(typeName);
91 foreach (Assembly loadedAssembly in LoadedAssemblies) {
92 if (!skipSystemAssemblies
93 || !IsKnownSystemAssembly(loadedAssembly)) {
94#pragma warning disable IL2026
95 value = loadedAssembly.GetType(longTypeName);
96#pragma warning restore IL2026
97 if (value != null) {
98 break;
99 }
100 }
101 }
102 if (value == null) {
103 return throwIfNotFound
104 ? throw new InvalidOperationException($"Type \"{longTypeName}\" not found in any loaded assembly.")
105 : null;
106 }
107 m_typesByName.Add(typeName, value);
108 }
109 return value;
110 }
111 }
112
113 public static string GetShortTypeName(string longTypeName) =>
114 m_longToShort.TryGetValue(longTypeName, out string value) ? value : longTypeName;
115
116 public static string GetLongTypeName(string shortTypeName) =>
117 m_shortToLong.TryGetValue(shortTypeName, out string value) ? value : shortTypeName;
118
119 static void AddShortTypeName(string shortTypeName, string longTypeName) {
120 m_shortToLong.Add(shortTypeName, longTypeName);
121 m_longToShort.Add(longTypeName, shortTypeName);
122 }
123 }
124}
static bool IsKnownSystemAssembly(Assembly assembly)
static List< Assembly > m_loadedAssemblies
static void AddShortTypeName(string shortTypeName, string longTypeName)
static Type FindType(string typeName, bool skipSystemAssemblies, bool throwIfNotFound)
static Dictionary< string, string > m_shortToLong
static Dictionary< string, Type > m_typesByName
static Dictionary< string, string > m_longToShort
static string GetLongTypeName(string shortTypeName)
static ReadOnlyList< Assembly > LoadedAssemblies
static string GetShortTypeName(string longTypeName)