From c737bd9aeb6002ab8cf888ec5cfaf914068dd1cd Mon Sep 17 00:00:00 2001 From: Anton Zhernosek Date: Wed, 21 Jun 2023 11:15:52 +0200 Subject: [PATCH] Added namespaces and fixed reflection method name bug --- .../SerializedPropertyExtensions.cs | 2 +- .../SerializableFuncBasePropertyDrawer.cs | 4 +- .../Base/SerializableFuncBase.cs | 131 ++++----- .../Implementations/SerializableFunc.cs | 249 +++++++++--------- .../Debugger/SerializableFuncDebugger.cs | 2 +- package.json | 2 +- 6 files changed, 198 insertions(+), 192 deletions(-) diff --git a/Editor/Extensions/SerializedProperty/SerializedPropertyExtensions.cs b/Editor/Extensions/SerializedProperty/SerializedPropertyExtensions.cs index 449e65e..6d5a041 100644 --- a/Editor/Extensions/SerializedProperty/SerializedPropertyExtensions.cs +++ b/Editor/Extensions/SerializedProperty/SerializedPropertyExtensions.cs @@ -6,7 +6,7 @@ using System.Reflection; using System.Text.RegularExpressions; using UnityEditor; -namespace Utilities.SerializableData.SerializableFunc.UnityEditorUtilities +namespace UnityUtilities.SerializableDataHelpers.UnityEditorUtilities { public static class SerializedPropertyExtensions { diff --git a/Editor/PropertyDrawer/SerializableFuncBasePropertyDrawer.cs b/Editor/PropertyDrawer/SerializableFuncBasePropertyDrawer.cs index 5fad306..24c951f 100644 --- a/Editor/PropertyDrawer/SerializableFuncBasePropertyDrawer.cs +++ b/Editor/PropertyDrawer/SerializableFuncBasePropertyDrawer.cs @@ -12,10 +12,10 @@ using UnityEngine; using UnityEngine.UIElements; using Utilities.Extensions.SystemExtensions; using Utilities.Extensions.UIToolkit; -using Utilities.SerializableData.SerializableFunc.UnityEditorUtilities; +using UnityUtilities.SerializableDataHelpers using Object = UnityEngine.Object; -namespace Utilities.SerializableData.SerializableFunc.UnityEditorDrawers +namespace UnityUtilities.SerializableDataHelpers.UnityEditorUtilities { [CustomPropertyDrawer(typeof(SerializableFuncBase<>), true)] public class SerializableFuncBasePropertyDrawer : PropertyDrawer diff --git a/Runtime/SerializableFunc/Base/SerializableFuncBase.cs b/Runtime/SerializableFunc/Base/SerializableFuncBase.cs index 2135e8f..f178731 100644 --- a/Runtime/SerializableFunc/Base/SerializableFuncBase.cs +++ b/Runtime/SerializableFunc/Base/SerializableFuncBase.cs @@ -4,80 +4,83 @@ using System.Reflection; using UnityEngine; using Object = UnityEngine.Object; -[System.Serializable] -public abstract class SerializableFuncBase - where TFuncType : Delegate +namespace UnityUtilities.SerializableDataHelpers { - [SerializeField] protected Object targetObject; - [SerializeField] protected string methodName; - - private TFuncType func; - - private static BindingFlags SuitableMethodsFlags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance; - - protected TFuncType GetReturnedFunc() + [System.Serializable] + public abstract class SerializableFuncBase + where TFuncType : Delegate { - if (func == null) + [SerializeField] protected Object targetObject; + [SerializeField] protected string methodName; + + private TFuncType func; + + private static BindingFlags SuitableMethodsFlags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance; + + protected TFuncType GetReturnedFunc() { - if (targetObject == null) + if (func == null) { - throw new ArgumentNullException("Target Object is null!"); + if (targetObject == null) + { + throw new ArgumentNullException("Target Object is null!"); + } + + if (string.IsNullOrWhiteSpace(methodName)) + { + throw new ArgumentNullException("Target Method is null!"); + } + + Type funcType = typeof(TFuncType); + + MethodInfo info = targetObject + .GetType() + .GetMethods(SuitableMethodsFlags) + .FirstOrDefault(x => IsTargetMethodInfo(x, funcType)); + + if (info == null) + { + throw new MissingMethodException($"Object \"{targetObject.name}\" is missing target method: {methodName}"); + } + + func = (TFuncType)Delegate.CreateDelegate(funcType, targetObject, methodName); } - if (string.IsNullOrWhiteSpace(methodName)) - { - throw new ArgumentNullException("Target Method is null!"); - } - - Type funcType = typeof(TFuncType); - - MethodInfo info = targetObject - .GetType() - .GetMethods(SuitableMethodsFlags) - .FirstOrDefault(x => IsTargetMethodInfo(x, funcType)); - - if (info == null) - { - throw new MissingMethodException($"Object \"{targetObject.name}\" is missing target method: {methodName}"); - } - - func = (TFuncType)Delegate.CreateDelegate(funcType, targetObject, methodName); + return func; } - return func; - } + #region Utility Functions - #region Utility Functions - - private bool IsTargetMethodInfo(MethodInfo methodInfo, Type funcType) - { - if (string.Equals(methodInfo.Name, methodName, StringComparison.InvariantCulture)) return false; - - Type[] typeArguments = funcType.GetGenericArguments(); - - if (methodInfo.ReturnType != typeArguments.Last()) return false; - - ParameterInfo[] parameters = methodInfo.GetParameters(); - - if (parameters.Length != (typeArguments.Length - 1)) return false; - - for (int i = 0; i < parameters.Length; i++) + private bool IsTargetMethodInfo(MethodInfo methodInfo, Type funcType) { - Type argType = typeArguments[i]; - ParameterInfo parameterInfo = parameters[i]; - if (argType != parameterInfo.ParameterType) return false; + if (!string.Equals(methodInfo.Name, methodName, StringComparison.InvariantCulture)) return false; + + Type[] typeArguments = funcType.GetGenericArguments(); + + if (methodInfo.ReturnType != typeArguments.Last()) return false; + + ParameterInfo[] parameters = methodInfo.GetParameters(); + + if (parameters.Length != (typeArguments.Length - 1)) return false; + + for (int i = 0; i < parameters.Length; i++) + { + Type argType = typeArguments[i]; + ParameterInfo parameterInfo = parameters[i]; + if (argType != parameterInfo.ParameterType) return false; + } + + return true; } - return true; + #endregion + + public static implicit operator TFuncType(SerializableFuncBase func) + { + if (func == null) return null; + + TFuncType result = func.GetReturnedFunc(); + return result; + } } - - #endregion - - public static implicit operator TFuncType(SerializableFuncBase func) - { - if (func == null) return null; - - TFuncType result = func.GetReturnedFunc(); - return result; - } -} +} \ No newline at end of file diff --git a/Runtime/SerializableFunc/Implementations/SerializableFunc.cs b/Runtime/SerializableFunc/Implementations/SerializableFunc.cs index 6a18cf8..bc9598c 100644 --- a/Runtime/SerializableFunc/Implementations/SerializableFunc.cs +++ b/Runtime/SerializableFunc/Implementations/SerializableFunc.cs @@ -1,175 +1,178 @@ -using System; - -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> +namespace UnityUtilities.SerializableDataHelpers { - public TReturn Invoke() + using System; + + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(); + public TReturn Invoke() + { + Func func = GetReturnedFunc(); + return func(); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0); + public TReturn Invoke(TArg0 arg0) + { + Func func = GetReturnedFunc(); + return func(arg0); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1); + public TReturn Invoke(TArg0 arg0, TArg1 arg1) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + } } -} -[System.Serializable] -public class SerializableFunc : SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11) + [System.Serializable] + public class SerializableFunc : SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); + } } -} -[System.Serializable] -public class SerializableFunc : - SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11, TArg12 arg12) + [System.Serializable] + public class SerializableFunc : + SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11, TArg12 arg12) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); + } } -} -[System.Serializable] -public class SerializableFunc : - SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11, TArg12 arg12, TArg13 arg13) + [System.Serializable] + public class SerializableFunc : + SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11, TArg12 arg12, TArg13 arg13) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); + } } -} -[System.Serializable] -public class SerializableFunc : - SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11, TArg12 arg12, TArg13 arg13, TArg14 arg14) + [System.Serializable] + public class SerializableFunc : + SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11, TArg12 arg12, TArg13 arg13, TArg14 arg14) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + } } -} -[System.Serializable] -public class SerializableFunc : - SerializableFuncBase> -{ - public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11, TArg12 arg12, TArg13 arg13, TArg14 arg14, TArg15 arg15) + [System.Serializable] + public class SerializableFunc : + SerializableFuncBase> { - Func func = GetReturnedFunc(); - return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); + public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11, TArg12 arg12, TArg13 arg13, TArg14 arg14, TArg15 arg15) + { + Func func = GetReturnedFunc(); + return func(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); + } } } \ No newline at end of file diff --git a/Samples~/SerializableFuncSampleScene/Scripts/Debugger/SerializableFuncDebugger.cs b/Samples~/SerializableFuncSampleScene/Scripts/Debugger/SerializableFuncDebugger.cs index 2dbc333..63fc83d 100644 --- a/Samples~/SerializableFuncSampleScene/Scripts/Debugger/SerializableFuncDebugger.cs +++ b/Samples~/SerializableFuncSampleScene/Scripts/Debugger/SerializableFuncDebugger.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using TMPro; using UnityEngine; -using Utilities.SerializableData.SerializableFunc; +using UnityUtilities.SerializableDataHelpers; public class SerializableFuncDebugger : MonoBehaviour { diff --git a/package.json b/package.json index 0cce1fa..20c6094 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "com.antonzhernosek.serializablefunc", "displayName": "SerializableFunc", - "version": "1.1.0", + "version": "1.1.1", "unity": "2020.3", "keywords": [ "unity",