private static void GetExposedExtensionMethods(Type type) { exposedExtensionMethods.Clear(); typeToExposedMethods.Clear(); MethodInfo[] methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); for (int i = 0; i < methods.Length; i++) { #if UNITY_EDITOR || !NETFX_CORE if (!Attribute.IsDefined(methods[i], typeof(RuntimeInspectorButtonAttribute), true)) #else if (!methods[i].IsDefined(typeof(RuntimeInspectorButtonAttribute), true)) #endif { continue; } ParameterInfo[] parameters = methods[i].GetParameters(); if (parameters.Length != 1) { continue; } #if UNITY_EDITOR || !NETFX_CORE RuntimeInspectorButtonAttribute attribute = (RuntimeInspectorButtonAttribute)Attribute.GetCustomAttribute(methods[i], typeof(RuntimeInspectorButtonAttribute), true); #else RuntimeInspectorButtonAttribute attribute = (RuntimeInspectorButtonAttribute)methods[i].GetCustomAttribute(typeof(RuntimeInspectorButtonAttribute), true); #endif Type parameterType = parameters[0].ParameterType; if (!attribute.IsInitializer || parameterType.IsAssignableFrom(methods[i].ReturnType)) { exposedExtensionMethods.Add(new ExposedExtensionMethodHolder(parameterType, methods[i], attribute)); } } }
public static ExposedMethod[] GetExposedMethods(this Type type) { ExposedMethod[] result; if (!typeToExposedMethods.TryGetValue(type, out result)) { MethodInfo[] methods = type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); List <ExposedMethod> exposedMethods = new List <ExposedMethod>(); for (int i = 0; i < methods.Length; i++) { #if UNITY_EDITOR || !NETFX_CORE if (!Attribute.IsDefined(methods[i], typeof(RuntimeInspectorButtonAttribute), true)) #else if (!methods[i].IsDefined(typeof(RuntimeInspectorButtonAttribute), true)) #endif { continue; } if (methods[i].GetParameters().Length != 0) { continue; } #if UNITY_EDITOR || !NETFX_CORE RuntimeInspectorButtonAttribute attribute = (RuntimeInspectorButtonAttribute)Attribute.GetCustomAttribute(methods[i], typeof(RuntimeInspectorButtonAttribute), true); #else RuntimeInspectorButtonAttribute attribute = (RuntimeInspectorButtonAttribute)methods[i].GetCustomAttribute(typeof(RuntimeInspectorButtonAttribute), true); #endif if (!attribute.IsInitializer || type.IsAssignableFrom(methods[i].ReturnType)) { exposedMethods.Add(new ExposedMethod(methods[i], attribute, false)); } } for (int i = 0; i < exposedExtensionMethods.Count; i++) { ExposedExtensionMethodHolder exposedExtensionMethod = exposedExtensionMethods[i]; if (exposedExtensionMethod.extendedType.IsAssignableFrom(type)) { exposedMethods.Add(new ExposedMethod(exposedExtensionMethod.method, exposedExtensionMethod.properties, true)); } } if (exposedMethods.Count > 0) { result = exposedMethods.ToArray(); } else { result = null; } typeToExposedMethods[type] = result; } return(result); }
public ExposedExtensionMethodHolder(Type extendedType, MethodInfo method, RuntimeInspectorButtonAttribute properties) { this.extendedType = extendedType; this.method = method; this.properties = properties; }
public ExposedMethod(MethodInfo method, RuntimeInspectorButtonAttribute properties, bool isExtensionMethod) { this.method = method; this.properties = properties; this.isExtensionMethod = isExtensionMethod; }