Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 交换方法指针_C#_Pointers_Methods - Fatal编程技术网

C# 交换方法指针

C# 交换方法指针,c#,pointers,methods,C#,Pointers,Methods,我已经试着解决这个问题有一段时间了,但我还没有找到答案。 基本上,我有一个方法,当被调用时,它实际上执行另一个不同的方法,而不是我假设需要我修改的方法本身,方法指针指向的地方 说这个, public class A : OtherRandomClass { protected void SomeMethod() { //code } } public class B { public void OtherMethod() { //code th

我已经试着解决这个问题有一段时间了,但我还没有找到答案。 基本上,我有一个方法,当被调用时,它实际上执行另一个不同的方法,而不是我假设需要我修改的方法本身,方法指针指向的地方

说这个,

public class A : OtherRandomClass
{
   protected void SomeMethod()
   {
     //code
   }
}

public class B
{
   public void OtherMethod()
   {
     //code that I want to execute when SomeMethod is called
   }
}
不幸的是,我无法修改类A的源代码,但我想尝试做的是调用SomeMethod,实际上调用OtherMethod,同时阻止调用SomeMethod本身,我不想求助于交换方法体

我知道这有多糟糕,但我使用的框架非常愚蠢,我别无选择

有什么办法吗


编辑:找到了我要找的东西,感谢所有试图帮助我的人

这看起来并不简单,老实说,我从未尝试过做这样的事

我真的很想知道你的背景,因为如果你想做的是我的最后一个选择,我不会使用这个程序集

建议使用反射将加载的方法体(然后用中间语言编写)替换为您自己的方法体:

您可以使用MethodInfo.GetMethodBody().GetILAsByteArray(),修改 然后将其重新插入MethodBuilder.CreateMethodBody()

然后,您可以检查一下,大致了解应该如何实现这一切,但CreateMethodBody似乎没有得到完全支持,可能会出现一些意外的行为


总的来说,它相当复杂,看起来不值得麻烦。

您控制的代码中是否有
SomeMethod
的所有调用站点,或者这也是不可修改的?另外,您的示例方法是实例方法,
A
B
似乎没有任何继承关系-在这样的调用过程中要从中变出的
B
实例在哪里?是否有用?@Damien\u不相信的人无法真正控制调用SomeMethod的任何站点。A和B是完全独立的类,在继承方面互不相关。
B
实例将在
A
之后实例化。还有,@mjwills,我还需要进一步研究,但看起来不是这样。为什么?这里是百万美元的问题。为什么不自己调用另一个方法呢?@Clint我可以自己调用,但我关心的是调用的位置。不管怎样,我找到了我要找的。你说得对。我来试试看结果如何。