以编程方式向类添加方法?

时间:2012-11-01 01:41:23

标签: c# .net reflection methods typedescriptor

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

唯一真正的方法是使用反编译和重新编译进入并修改dll的字节码。这就是Postsharp做AOP的方式,但是imo,我从来没有因为任何其他原因这样做。

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

答案 1 :(得分:0)

在我看来,你也会使用反射,省去一些头痛并将这种逻辑包含在扩展方法中(即使你特别说不是)。

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