C#反射调用方法而无需访问实例化类型

时间:2021-02-24 00:51:20

标签: c# reflection

我正在开发一个代码库,该代码库向消息处理程序提供命令以拦截某种类型的消息。

注册函数如下所示:

RegHandler<T>(Func<T, IMessageMetaData, Task> handler) where T : IMessage

我希望通过创建一个抽象类来添加一些关于如何预处理消息的通用功能,该抽象类确实捕获从该函数转发到注册函数的消息。基类将实现它自己的“RegHandler”,用于跟踪 type/func。然后它会实现一个

Task MsgHandler(IMessage, IMessageMetaData)

我将注册为所有类型继承类的处理程序的函数。

类可以从这里继承并用属性标记它们的消息处理程序。我会反射性地迭代实例化的子类以找到具有指定属性的方法并

  1. 使用基类函数“RegHandler”注册类型/函数
  2. 向客户端注册基类处理程序作为拦截此消息的处理程序(client.Register(childClass.MsgHandler)

这样,客户端应该将继承类注册的每一条消息都指向基类处理程序“MsgHandler”,MsgHandler会做它的预处理然后调用继承类实现的方法,以便它可以做它需要做的事情做。

一个类调用 RegHandler 方法的正常方式是这样的:

public class ClassWithHandler
{
    public async Task MyMessageHandler(MyMessageType message, IMessageMetatData) : where MyMessageType : IMessage
    {

    }
}

ClassWithHandler cwh = new ClassWithHandler();
client.RegHandler(cwh.MyMessageHandler);

我看过这个答案:https://stackoverflow.com/a/2933227/4089216,它显示了当您有权访问该对象时如何调用该方法,但它还在调用本身中包含该对象(即 Func<ClassWithHandler、IMessage、IMessageMetaData、Task>).

我的问题是我无法更改“RegHandler”的客户端版本,因为太多遗留组件依赖它,也无法向类添加功能以跟踪拥有处理程序的实例化类,以便反射性地调用该方法就像上面一样。

因此,我需要将 MethodInfo(可以访问实例化对象)转换为 Func 而不是 上面的方法,它会给我 Func。有没有办法使用反射获取 RegHandler 要求的格式的引用?

感谢您的时间,如果您需要更多信息,请告诉我

0 个答案:

没有答案
相关问题