From 5d58993b073ce108138b07aab5a6d3b91db7d618 Mon Sep 17 00:00:00 2001 From: sinaioutlander <49360850+sinaioutlander@users.noreply.github.com> Date: Tue, 15 Sep 2020 17:38:10 +1000 Subject: [PATCH] 1.7.31 * Added support for Il2Cpp Hashtable (non-generic Dict) * Dictionaries should now display CacheOther values better (smaller buttons) * Cleaned up and improved some of CacheDictionary performance --- src/CachedObjects/CacheObjectBase.cs | 2 +- src/CachedObjects/Object/CacheDictionary.cs | 39 +++++---------------- src/CppExplorer.cs | 2 +- src/Helpers/ReflectionHelpers.cs | 5 +-- src/Menu/MainMenu/Pages/SearchPage.cs | 2 +- src/Tests/TestClass.cs | 24 +++++++++++++ 6 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/CachedObjects/CacheObjectBase.cs b/src/CachedObjects/CacheObjectBase.cs index 5f569d3..19a051e 100644 --- a/src/CachedObjects/CacheObjectBase.cs +++ b/src/CachedObjects/CacheObjectBase.cs @@ -172,7 +172,7 @@ namespace Explorer { holder = new CacheDictionary(); } - else if (ReflectionHelpers.IsEnumerable(valueType) || ReflectionHelpers.IsCppEnumerable(valueType)) + else if (ReflectionHelpers.IsEnumerable(valueType)) { holder = new CacheList(); } diff --git a/src/CachedObjects/Object/CacheDictionary.cs b/src/CachedObjects/Object/CacheDictionary.cs index 5fdedcf..6f2b4ce 100644 --- a/src/CachedObjects/Object/CacheDictionary.cs +++ b/src/CachedObjects/Object/CacheDictionary.cs @@ -98,37 +98,16 @@ namespace Explorer private void GetGenericArguments() { - if (this.MemInfo != null) + if (ValueType.IsGenericType) { - Type memberType = null; - switch (this.MemInfo.MemberType) - { - case MemberTypes.Field: - memberType = (MemInfo as FieldInfo).FieldType; - break; - case MemberTypes.Property: - memberType = (MemInfo as PropertyInfo).PropertyType; - break; - } - - if (memberType != null && memberType.IsGenericType) - { - m_keysType = memberType.GetGenericArguments()[0]; - m_valuesType = memberType.GetGenericArguments()[1]; - } + m_keysType = ValueType.GetGenericArguments()[0]; + m_valuesType = ValueType.GetGenericArguments()[1]; } - else if (Value != null) + else { - var type = Value.GetType(); - if (type.IsGenericType) - { - m_keysType = type.GetGenericArguments()[0]; - m_valuesType = type.GetGenericArguments()[1]; - } - else - { - MelonLogger.Log("TODO? Dictionary is of type: " + Value.GetType().FullName); - } + // It's non-generic, just use System.Object to allow for anything. + m_keysType = typeof(object); + m_valuesType = typeof(object); } } @@ -288,10 +267,10 @@ namespace Explorer GUILayout.Label($"[{i}]", new GUILayoutOption[] { GUILayout.Width(30) }); GUILayout.Label("Key:", new GUILayoutOption[] { GUILayout.Width(40) }); - key.DrawValue(window, (window.width / 2) - 30f); + key.DrawValue(window, (window.width / 2) - 80f); GUILayout.Label("Value:", new GUILayoutOption[] { GUILayout.Width(40) }); - val.DrawValue(window, (window.width / 2) - 30f); + val.DrawValue(window, (window.width / 2) - 80f); } } diff --git a/src/CppExplorer.cs b/src/CppExplorer.cs index 2478d67..531b887 100644 --- a/src/CppExplorer.cs +++ b/src/CppExplorer.cs @@ -13,7 +13,7 @@ namespace Explorer public class CppExplorer : MelonMod { public const string NAME = "CppExplorer"; - public const string VERSION = "1.7.3"; + public const string VERSION = "1.7.31"; public const string AUTHOR = "Sinai"; public const string GUID = "com.sinai.cppexplorer"; diff --git a/src/Helpers/ReflectionHelpers.cs b/src/Helpers/ReflectionHelpers.cs index ba08773..a236e7c 100644 --- a/src/Helpers/ReflectionHelpers.cs +++ b/src/Helpers/ReflectionHelpers.cs @@ -36,7 +36,7 @@ namespace Explorer public static bool IsEnumerable(Type t) { - return typeof(IEnumerable).IsAssignableFrom(t); + return typeof(IEnumerable).IsAssignableFrom(t) || IsCppEnumerable(t); } // Checks for Il2Cpp List or HashSet. @@ -68,7 +68,8 @@ namespace Explorer } else { - return typeof(Il2CppSystem.Collections.IDictionary).IsAssignableFrom(t); + return typeof(Il2CppSystem.Collections.IDictionary).IsAssignableFrom(t) + || typeof(Il2CppSystem.Collections.Hashtable).IsAssignableFrom(t); } } diff --git a/src/Menu/MainMenu/Pages/SearchPage.cs b/src/Menu/MainMenu/Pages/SearchPage.cs index e982dce..15d03ef 100644 --- a/src/Menu/MainMenu/Pages/SearchPage.cs +++ b/src/Menu/MainMenu/Pages/SearchPage.cs @@ -428,7 +428,7 @@ namespace Explorer { var t = ReflectionHelpers.GetActualType(obj); - if (!FilterName(t.FullName) || ReflectionHelpers.IsEnumerable(t) || ReflectionHelpers.IsCppEnumerable(t)) + if (!FilterName(t.FullName) || ReflectionHelpers.IsEnumerable(t)) { continue; } diff --git a/src/Tests/TestClass.cs b/src/Tests/TestClass.cs index 91a2221..272ef3b 100644 --- a/src/Tests/TestClass.cs +++ b/src/Tests/TestClass.cs @@ -22,6 +22,30 @@ namespace Explorer.Tests ILHashSetTest.Add("3"); } + // test a non-generic dictionary + + public Hashtable TestNonGenericDict() + { + return new Hashtable + { + { "One", 1 }, + { "Two", 2 }, + { "Three", 3 }, + }; + } + + // IL2CPP HASHTABLE NOT SUPPORTED! Cannot assign Il2CppSystem.Object from primitive struct / string. + // Technically they are "supported" but if they contain System types they will not work. + + //public Il2CppSystem.Collections.Hashtable TestIl2CppNonGenericDict() + //{ + // var table = new Il2CppSystem.Collections.Hashtable(); + // table.Add("One", 1); + // table.Add("One", 2); + // table.Add("One", 3); + // return table; + //} + // test HashSets public static HashSet HashSetTest = new HashSet