c# - 钩子(Hook)在没有委托(delegate)的情况下运行(反射)

标签 c# unity3d reflection

有没有一种方法可以在不使用委托(delegate)的情况下使用反射将一个函数 Hook 到另一个函数?

class A
{
    void Foo()
    {
    }
}

class B
{
    void Main()
    {
        A a = new A();
        a.GetType().GetMethod("Foo").AddHook(a, Func); //I want something like this
        a.Foo();
        //Func gets called
    }

    void Func()
    {
    }
}

有没有办法在调用 Foo 后调用 Func 而无需使用事件、委托(delegate)或仅从 Foo 内部调用 Func

我需要它以便我的游戏的 UI Controller 可以得到更新。

我看到大多数人处理这个问题的方式是将一堆事件添加到 A 并将 B 订阅到这些事件。像这样

class A
{
‎    public delegate void UICallback();
‎    public event UICallback onFoo;
    void Foo()
    {
    ‎    onFoo.Invoke();
    }
}

class B
{
    void Main()
    {
        A a = new A();
        ‎a.onFoo += Func;
        a.Foo();
    }

    void Func()
    {
    }
}

我发现这种方法的问题是我需要向许多类添加一堆这样的事件(可能超过 5 个甚至 10 个),然后记得在函数末尾调用这些事件来更新UI(例如,在 StartBattle() 结束时调用 onBattleStarted)。这除了增加我的类的大小外,还有大块的事件声明使阅读变得难看,而且更难维护。

编辑 我认为没有人真正理解我在寻找什么......我想要一种方法将 Func Hook 到 Foo 不对 Foo 进行任何更改,即 Foo 不知道此回调存在。使用 Action 无济于事,因为我需要在 Foo 的参数上指定它应该调用 Func

感谢您的帮助!

最佳答案

您可以在 Func() 的末尾调用 Action。

Class A
{
   void Foo()
   {
   }
}

Class B
{
   void Main()
   {
    A a = new A();
    Func( () => {a.Foo();});
   }

   void Func(Action onFinish)
   {
    //Enter your code here
    onFinish();
   }

关于c# - 钩子(Hook)在没有委托(delegate)的情况下运行(反射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48287441/

相关文章:

c# - 从字符串列表中添加和删除项目,仅在项目不存在时添加

c# - Dispatcher.BeginInvoke(...) 不调度任何内容

c# - xxx.tostring() 和 (string)xxx 有什么区别?

performance - 找到游戏对象的更好(和更便宜)的方法?

c# - 协程Wrapper没有及时执行回调

java - 注释如何访问参数信息?

c# - 在 C# 中测试对象是否为泛型类型

c# - 模拟 Autofac.IComponentContext 单元测试 c#

android - 通过 Google Play 服务将 AdMob 与 Unity 3D 集成

java - java中的.class文件