mirror of
https://github.com/GrahamKracker/UnityExplorer.git
synced 2025-07-01 11:12:49 +08:00
76 lines
2.0 KiB
C#
76 lines
2.0 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using Explorer.CacheObject;
|
|
using UnityEngine;
|
|
|
|
namespace Explorer
|
|
{
|
|
public static class CacheFactory
|
|
{
|
|
public static CacheObjectBase GetCacheObject(object obj)
|
|
{
|
|
if (obj == null) return null;
|
|
|
|
return GetCacheObject(obj, ReflectionHelpers.GetActualType(obj));
|
|
}
|
|
|
|
public static CacheObjectBase GetCacheObject(object obj, Type type)
|
|
{
|
|
var ret = new CacheObjectBase();
|
|
ret.Init(obj, type);
|
|
return ret;
|
|
}
|
|
|
|
public static CacheMember GetCacheObject(MemberInfo member, object declaringInstance)
|
|
{
|
|
CacheMember ret;
|
|
|
|
if (member is MethodInfo mi && CanProcessArgs(mi.GetParameters()))
|
|
{
|
|
ret = new CacheMethod();
|
|
ret.InitMember(mi, declaringInstance);
|
|
}
|
|
else if (member is PropertyInfo pi && CanProcessArgs(pi.GetIndexParameters()))
|
|
{
|
|
ret = new CacheProperty();
|
|
ret.InitMember(pi, declaringInstance);
|
|
}
|
|
else if (member is FieldInfo fi)
|
|
{
|
|
ret = new CacheField();
|
|
ret.InitMember(fi, declaringInstance);
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
public static bool CanProcessArgs(ParameterInfo[] parameters)
|
|
{
|
|
foreach (var param in parameters)
|
|
{
|
|
var pType = param.ParameterType;
|
|
|
|
if (pType.IsByRef && pType.HasElementType)
|
|
{
|
|
pType = pType.GetElementType();
|
|
}
|
|
|
|
if (pType.IsPrimitive || pType == typeof(string))
|
|
{
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|