Слушатель интерфейса C# без подписки - PullRequest
0 голосов
/ 21 апреля 2020

Я использовал много 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... }
}

1 Ответ

0 голосов
/ 21 апреля 2020

В c# такое поведение может быть достигнуто с помощью отражения .

Один пример в комментариях упоминает Unity и его методы, такие как OnBeginDrag или Update. Они не вызываются с помощью c# events. Unity в основном написан на c ++ и после компиляции кода c# Unity ищет все классы, реализующие определенные интерфейсы или наследующие от определенных классов (например, MonoBehaviour), и проверяет, есть ли у них подходящие методы (например, Update()), чтобы он мог при необходимости вызывайте их позже.

В другом комментарии упоминается Photon, сетевой движок, обычно используемый в Unity. В этом случае нет "волхвов c" или даже отражения. Чтобы получить обратные вызовы Photon'а, вы должны вызвать метод PhotonNetwork.AddCallbackTarget и передать экземпляр вашего класса в качестве аргумента. Единственная запутанная вещь в случае с Фотоном - факт, что вам не нужно делать это напрямую. Вместо того, чтобы вызывать этот метод самостоятельно, вы можете просто унаследовать класс MonoBehaviourPunCallbacks, который реализует все интерфейсы обратного вызова Photon'а и вызовы PhotonNetwork.AddCallbackTarget в его методе OnEnable. Этот метод в свою очередь вызывается Unity, как я объяснил ранее.

...