今天突然有需求需要通过反射调用指定对象的委托方法,但是搜了半天也没找到相关的资料。后台终于在国外论坛发现了解决方法,这里总结分享一下。
先上代码:
class ReflectionDelegateTest
{
public static void Main()
{
//首先将方法绑定到委托上
action += Run;
//首先获取委托所在类的Type
System.Type type = typeof(ReflectionDelegateTest);
//***因为委托实际上是字段,所以这里要用GetField来查找到它的信息***
System.Reflection.FieldInfo actionField = type.GetField("action", BindingFlags.Public | BindingFlags.Static);
//***通过字段信息获取到字段对应的值***
object actionObject = actionField.GetValue(null);
//***通过字段值获取到Invoke方法的元数据***
System.Reflection.MethodInfo handlerMethod = actionObject.GetType().GetMethod("Invoke");
//现在可以反射调用委托了,记得传入字段对应的值对象
handlerMethod.Invoke(actionObject, new object[] { "Call By Reflection!" });
System.Console.ReadKey();
}
/// <summary>
/// 泛型委托
/// </summary>
public static System.Action<string> action;
public static void Run(string msg)
{
System.Console.WriteLine(msg);
}
}
其实关键就是以下几点:
- 委托其实是个字段,要用GetField来获取
- 先拿到字段对应的对象,然后拿到该对象对应的Invoke方法进行反射调用
- 调用的时候记得传入字段对应的对象