You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.6 KiB
80 lines
2.6 KiB
4 years ago
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Reflection;
|
||
|
using UnityEngine;
|
||
|
#if UNITY_EDITOR
|
||
|
using UnityEditor;
|
||
|
#endif
|
||
|
|
||
|
public static class ReflectionExtensions
|
||
|
{
|
||
|
public static void InvokeMethod(this object obj, string method, object value = null)
|
||
|
{
|
||
|
if (obj == null)
|
||
|
throw new NullReferenceException("Target Object is null.");
|
||
|
|
||
|
Type objType = obj.GetType();
|
||
|
object[] argValues = null;
|
||
|
Type[] argTypes = null;
|
||
|
|
||
|
if (value == null)
|
||
|
{
|
||
|
argValues = new object[0];
|
||
|
argTypes = new Type[0];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
argValues = new object[] { value };
|
||
|
argTypes = new Type[] { value.GetType() };
|
||
|
}
|
||
|
|
||
|
InvokeMethod(obj, objType, method, argValues, argTypes);
|
||
|
}
|
||
|
|
||
|
public static void InvokeMethod(this object obj, string method, object[] argValues, Type[] argTypes)
|
||
|
{
|
||
|
InvokeMethod(obj, obj.GetType(), method, argValues, argTypes);
|
||
|
}
|
||
|
|
||
|
private static void InvokeMethod(object obj, Type objectType, string method, object[] argValues, Type[] argTypes)
|
||
|
{
|
||
|
#if !NETFX_CORE
|
||
|
BindingFlags bindingAttr = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.OptionalParamBinding;
|
||
|
MethodInfo methodInfo = null;
|
||
|
|
||
|
// 基于方法名称和参数类型查找
|
||
|
if (argValues != null)
|
||
|
methodInfo = objectType.GetMethod(method, bindingAttr, null, argTypes, null);
|
||
|
else
|
||
|
methodInfo = objectType.GetMethod(method, bindingAttr);
|
||
|
|
||
|
if (methodInfo != null)
|
||
|
methodInfo.Invoke(obj, argValues);
|
||
|
else if (objectType.BaseType != null)
|
||
|
InvokeMethod(obj, objectType.BaseType, method, argValues, argTypes);
|
||
|
else
|
||
|
throw new MissingMethodException();
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
public static void InvokeStaticMethod(this Type objectType, string method, object[] argValues, Type[] argTypes)
|
||
|
{
|
||
|
#if !NETFX_CORE
|
||
|
BindingFlags bindingAttr = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.OptionalParamBinding;
|
||
|
MethodInfo methodInfo = null;
|
||
|
|
||
|
if (argValues != null)
|
||
|
methodInfo = objectType.GetMethod(method, bindingAttr, null, argTypes, null);
|
||
|
else
|
||
|
methodInfo = objectType.GetMethod(method, bindingAttr);
|
||
|
|
||
|
if (methodInfo != null)
|
||
|
methodInfo.Invoke(null, argValues);
|
||
|
else if (objectType.BaseType != null)
|
||
|
InvokeStaticMethod(objectType.BaseType, method, argValues, argTypes);
|
||
|
else
|
||
|
throw new MissingMethodException();
|
||
|
#endif
|
||
|
}
|
||
|
}
|