45 lines
1.5 KiB
C#
45 lines
1.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using Object = UnityEngine.Object;
|
|
|
|
namespace MoreMountains.Tools
|
|
{
|
|
static class MMMonoBehaviourFieldInfo
|
|
{
|
|
public static Dictionary<int, List<FieldInfo>> FieldInfoList = new Dictionary<int, List<FieldInfo>>();
|
|
|
|
public static int GetFieldInfo(Object target, out List<FieldInfo> fieldInfoList)
|
|
{
|
|
Type targetType = target.GetType();
|
|
int targetTypeHashCode = targetType.GetHashCode();
|
|
|
|
if (!FieldInfoList.TryGetValue(targetTypeHashCode, out fieldInfoList))
|
|
{
|
|
IList<Type> typeTree = targetType.GetBaseTypes();
|
|
fieldInfoList = target.GetType().GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.NonPublic)
|
|
.OrderByDescending(x => typeTree.IndexOf(x.DeclaringType))
|
|
.ToList();
|
|
FieldInfoList.Add(targetTypeHashCode, fieldInfoList);
|
|
}
|
|
|
|
return fieldInfoList.Count;
|
|
}
|
|
|
|
public static IList<Type> GetBaseTypes(this Type t)
|
|
{
|
|
var types = new List<Type>();
|
|
while (t.BaseType != null)
|
|
{
|
|
types.Add(t);
|
|
t = t.BaseType;
|
|
}
|
|
|
|
return types;
|
|
}
|
|
}
|
|
}
|