0

我正在处理一个 API,它有一个包含数百万个方法的类,我知道这些方法的作用,它们只是 Web 服务的代理。

API 在内部使用反射调用适当的方法名称来调用这些代理方法(不要问我为什么这样做)。

Web 服务中有一些方法没有被 API 实现,我需要动态地“注入”这些代理方法。

所以我的问题是:如何向现有类添加方法(不是扩展方法)?

我可以通过Reflection.Emit做到这一点,但我不知道 MSIL。
无论如何我要提到它,因为我已经创建了另一个类,它继承自与 API 相同的基类,并在那里实现了方法,所以也许有一种方法可以将方法复制到 API 类,因为它们只调用同一个基类的方法。

4

2 回答 2

1

实际上,您不可能以您想要的方式修改现有的类。即使使用 Reflection.Emit,它也不会做你想做的事,因为 API 正在调用特定的类型,并且你不能在运行时修改类型的定义。你可以用 Reflection.Emit 做的是定义一个从代理继承的类型,但是让 API 加载你继承的类型可能会被证明是不可能的,除非他们使用依赖注入框架,这似乎不太可能。

唯一真正做到这一点的方法是使用反编译和重新编译进入并修改 dll 的字节码。这就是 Postsharp 执行 AOP 的方式,但 imo,出于任何其他原因,我永远不会这样做。

如果您可以访问此代码甚至他们的库,那么可能有更好的方法来解决您的问题。

于 2012-11-01T01:53:24.873 回答
0

在我看来,您也将使用反射,省去一些头痛并将该逻辑包装在扩展方法中(即使您明确表示不这样做)。

如果你有更多关于为什么扩展方法在这种情况下是一个坏主意的信息,或者你为什么想做一些 API 开发人员没有公开的事情,我可能会想出一些更有用的东西。

于 2012-11-01T01:50:14.773 回答