2using System.Collections;
3using System.Collections.Generic;
5using System.Reflection;
11 public static class Extensions
13 public static bool Contains(
this string s,
string searchText, StringComparison sc)
15 return s.IndexOf(searchText, sc) >= 0;
18 public static T Next<T>(
this T src) where T :
struct
20 if (!typeof(T).IsEnum)
throw new ArgumentException(
string.Format(
"Argumnent {0} is not an Enum",
23 var arr = (T[])Enum.GetValues(src.GetType());
24 var j = Array.IndexOf(arr, src) + 1;
25 return (arr.Length == j) ? arr[0] : arr[j];
28 public static object GetPrivateExplicit<T>(
this T
self,
string name)
30 return typeof(T).GetField(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy).GetValue(
self);
32 public static object GetPrivate(
this object self,
string name)
34 return self.GetType().GetField(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy).GetValue(
self);
36 public static void SetPrivateExplicit<T>(
this T
self,
string name,
object value)
38 typeof(T).GetField(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy).SetValue(
self, value);
40 public static void SetPrivate(
this object self,
string name,
object value)
42 self.GetType().GetField(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy).SetValue(
self, value);
44 public static object CallPrivateExplicit<T>(
this T
self,
string name, params
object[] p)
46 return typeof(T).GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy)?.Invoke(
self, p);
48 public static object CallPrivate(
this object self,
string name, params
object[] p)
50 return self.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy)?.Invoke(
self, p);
53 public static void ExecuteDelayed(
this MonoBehaviour
self, Action action,
int waitCount = 1)
55 self.StartCoroutine(ExecuteDelayed_Routine(action, waitCount));
58 private static IEnumerator ExecuteDelayed_Routine(Action action,
int waitCount)
60 for (var i = 0; i < waitCount; ++i)
65 public static string GetPathFrom(
this Transform
self, Transform root)
68 var path = self2.name;
72 path = self2.name +
"/" + path;
78 public static Transform FindDescendant(
this Transform
self,
string name)
80 if (
self.name.Equals(name))
82 foreach (Transform t
in self)
84 var res = t.FindDescendant(name);
91 public static MemberInfo GetMemberInfo(
this ICacheEntry centry,
bool throwOnError)
95 if (!throwOnError)
return null;
96 throw new ArgumentNullException();
103 if (m !=
null)
return m.MethodInfo;
104 if (p !=
null)
return p.PropertyInfo;
108 throw new Exception(
"Cannot open items of type " + centry.GetType().FullName);
112 public static IEnumerable<Type> GetTypesSafe(
this Assembly ass)
114 try {
return ass.GetTypes(); }
115 catch (ReflectionTypeLoadException e) {
return e.Types.Where(x => x !=
null); }
116 catch {
return Enumerable.Empty<Type>(); }
119 public static string GetFullTransfromPath(
this Transform target)
121 var name = target.name;
122 var parent = target.parent;
123 while (parent !=
null)
125 name =
string.Format(
"{0}/{1}", parent.name, name);
126 parent = parent.parent;
131 internal static string IsNullOrDestroyed(
this object value)
133 if (ReferenceEquals(value,
null))
return "NULL";
138 if (uobj.Equals(
null))
return "NULL (Destroyed)";