c# – 没有代表的钩子(反射)

有没有办法可以使用反射将一个函数挂钩到另一个函数而不使用委托?

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而不使用事件,委托或只是从Foo内部调用Func?

我需要这个,所以我的游戏的UI控制器可以更新.

我看到大多数人处理这个问题的方法是向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(调用) onBattleStarted在StartBattle()的末尾,例如).除了使用大块事件声明增加我的类的大小使其难以阅读之外,这使得它更难维护.

编辑我认为没有人真正了解我正在寻找的东西…我想要一种方法将Func挂钩到Foo而不对Foo做任何更改,即没有Foo知道这个回调存在.使用动作无济于事,因为我需要在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();
   }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐