【问题标题】:Interface Listener C# without subscribing无需订阅的接口侦听器 C#
【发布时间】:2020-04-21 11:13:32
【问题描述】:

我一直在使用很多 API 来监听一些事件,我只需要实现一个接口,但它不需要我订阅,他们是如何做到的?

在这里更好地解释一下我通常是如何做我的听众的

interface IListener
{
    void OnEventHappen();
}

public class EventClass
{
     public static Action onEvent;
}

public class ListenerClass : IListener
{
    //constructor
    public ListenerClass()
    {
         EventClass.onEvent += OnEventHappen;
    }

    //function from IListener interface
    public void OnEventHappen() { //something... }
}

但是在那些 API 中,不需要在任何地方订阅,我只需要实现这样的接口:(我删除了 EventClass,因为在这些 API 中我无法访问触发事件的类)

interface IListener
{
    void OnEventHappen();
}

public class ListenerClass : IListener
{
    //function from IListener interface
    public void OnEventHappen() { //something... }
}

【问题讨论】:

  • 那么,您的问题是什么?
  • 你能说出其中一个 API 的名字,以便我们知道我们面临的问题吗?想到的是,他们可能会遍历所有程序集并寻找实现 IListener 的类型并创建一个实例并调用它。
  • 查看具体类如何“神奇地注册”的最佳方法可能是在构造函数中放置一个断点并查看调用堆栈。
  • 一个例子(不是 API)在 Unity 中,要使用 IBeginDragHandler 我只需要使用 EventSystems 并实现 OnBeginDrag(PointerEventData eventData) 方法
  • Unity 使用了大量的反射。它可以在 Unity 之外执行各种不是真正惯用的 C# 或 .NET 的事情。您的问题是您一直在使用“很多 API”来自动执行此操作 - 您能否提供任何示例?

标签: c# events interface listener


【解决方案1】:

在 c# 中,可以使用 reflection 来实现这种行为。

cmets 中的一个示例提到了 Unity,它的方法类似于 OnBeginDragUpdate。这些不是使用 c#events 调用的。 Unity 主要是用 c++ 编写的,在你的 c# 代码编译后,Unity 会查找所有实现某些接口或从某些类继承的类(如MonoBehaviour)并检查它们是否具有匹配的方法(如Update()),以便它可以调用它们以后有需要的时候。

另一条评论提到了 Photon,这是 Unity 常用的网络引擎。在这种情况下,没有“魔法”甚至反射。要接收 Photon 的回调,您必须调用 PhotonNetwork.AddCallbackTarget 方法并将您的类的实例作为参数传递。在 Photon 的情况下唯一令人困惑的事情是事实,您不必直接这样做。不用自己调用这个方法,你可以从实现所有 Photon 回调接口的MonoBehaviourPunCallbacks 类继承,并在它的OnEnable 方法中调用PhotonNetwork.AddCallbackTarget。就像我之前解释的那样,Unity 会依次调用该方法。

【讨论】:

  • 有没有办法复制这个? Photon(统一的网络框架)例如具有具有相同行为的 IPunObservable
  • 我猜想通过让它对用户更友好,他们也更难理解幕后的事情是如何运作的。谢谢!
猜你喜欢
  • 2018-12-12
  • 2020-12-18
  • 2017-03-30
  • 2019-12-11
  • 1970-01-01
  • 2020-07-05
  • 2019-07-14
  • 2017-09-30
  • 2021-03-16
相关资源
最近更新 更多