Initial Commit
This commit is contained in:
73
Runtime/SerializableFunc/SerializableFunc.cs
Normal file
73
Runtime/SerializableFunc/SerializableFunc.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace Utilities.SerializableData.SerializableFunc
|
||||
{
|
||||
[System.Serializable]
|
||||
public class SerializableFunc<TReturn>
|
||||
{
|
||||
[SerializeField] protected Object targetObject;
|
||||
[SerializeField] protected string methodName;
|
||||
|
||||
private Func<TReturn> func;
|
||||
|
||||
public Func<TReturn> Func { get { return GetReturnedFunc(); } }
|
||||
|
||||
public TReturn Invoke()
|
||||
{
|
||||
Func<TReturn> func = GetReturnedFunc();
|
||||
|
||||
if (func != null) return func();
|
||||
return default;
|
||||
}
|
||||
|
||||
#region Protected Interface
|
||||
|
||||
protected Func<TReturn> GetReturnedFunc()
|
||||
{
|
||||
if (func == null)
|
||||
{
|
||||
if (targetObject == null) return null;
|
||||
if (string.IsNullOrWhiteSpace(methodName)) return null;
|
||||
|
||||
MethodInfo info = targetObject
|
||||
.GetType()
|
||||
.GetMethods(BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
|
||||
.FirstOrDefault(x => IsTargetMethodInfo(x));
|
||||
|
||||
if (info == null) return null;
|
||||
|
||||
func = (Func<TReturn>)Delegate.CreateDelegate(typeof(Func<TReturn>), targetObject, methodName);
|
||||
}
|
||||
|
||||
return func;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Utility Functions
|
||||
|
||||
private bool IsTargetMethodInfo(MethodInfo x)
|
||||
{
|
||||
return string.Equals(x.Name, methodName, StringComparison.InvariantCultureIgnoreCase)
|
||||
&& x.ReturnType == typeof(TReturn)
|
||||
&& x.GetParameters().Length == 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Operators
|
||||
|
||||
public static implicit operator Func<TReturn>(SerializableFunc<TReturn> serializableFunc)
|
||||
{
|
||||
if (serializableFunc == null) return null;
|
||||
|
||||
return serializableFunc.GetReturnedFunc();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
11
Runtime/SerializableFunc/SerializableFunc.cs.meta
Normal file
11
Runtime/SerializableFunc/SerializableFunc.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 638c2cd796656454f8e97e9ef2cc6ae9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user