using System.Collections.Generic; using UnityEngine; using System; using System.Reflection; using System.Linq; namespace UnityEditor.Polybrush { static class ReflectionUtility { const BindingFlags k_AllFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; /// /// Prints a warning /// /// static void Warning(string text) { Debug.LogWarning(text); } /// /// Fetch a type with name and optional assembly name. `type` should include namespace. /// /// /// /// internal static Type GetType(string type, string assembly = null) { Type t = Type.GetType(type); if(t == null) { IEnumerable assemblies = AppDomain.CurrentDomain.GetAssemblies(); if(assembly != null) assemblies = assemblies.Where(x => x.FullName.Contains(assembly)); foreach(Assembly ass in assemblies) { t = ass.GetType(type); if(t != null) return t; } } return t; } /// /// Fetch a value using GetProperty or GetField. /// /// /// /// /// /// internal static object GetValue(object target, string type, string member, BindingFlags flags = k_AllFlags) { Type t = GetType(type); if(t == null) { Warning(string.Format("Could not find type \"{0}\"!", type)); return null; } else return GetValue(target, t, member, flags); } internal static object GetValue(object target, Type type, string member, BindingFlags flags = k_AllFlags) { PropertyInfo pi = type.GetProperty(member, flags); if(pi != null) return pi.GetValue(target, null); FieldInfo fi = type.GetField(member, flags); if(fi != null) return fi.GetValue(target); Warning(string.Format("Could not find member \"{0}\" matching type {1}!", member, type)); return null; } } }