簡體   English   中英

相當於Java列表的C# <? extends MyFancyClass>

[英]C# equivalent of Java's List<? extends MyFancyClass>

我不相信我在任何地方都看到了這一點(我不確定該如何真正表達這個問題,所以可能是為什么),所以,如果已經回答了,我表示歉意。

我目前正在編寫一個具有事件API的應用程序,第三方可以將其插入其中,以下是我用來觸發事件的代碼。

// Events.cs from the API project
public interface IEventListener
{
    void Handle(IEvent @event);
}

public abstract class EventManager
{
    public abstract void Register(PluginBase plugin, IEventListener listener);
    public abstract void Call(IEvent @event);
}

// Events.cs from the main project
public class SimpleEventManager : EventManager
{
    private readonly Dictionary<PluginBase, List<IEventListener>> _events = 
        new Dictionary<PluginBase, List<IEventListener>>();

    public override void Register(PluginBase plugin, IEventListener listener)
    {

    }

    public override void Call(IEvent @event)
    {
       // Iterate through _events.Values and call Handle on each IEventListener
    }
}

盡管上面的代碼可以正常工作,但是我發現第三方如何將其鈎入極其丑陋的位置,並想知道是否有可能將其連接起來以使用Action類。

// TestPlugin.cs
class MyTestPlugin : PluginBase
{
    var handler = new MyEventHandler();
    App.Instance.EventManager.Register(this, handler);
}

class MyEventHandler : IEventListener
{
   public void Handle(IEvent @event)
   {
       if(@event is SomeEvent) HandleSomeEvent((SomeEvent) @event);
   }

   private void HandleSomeEvent(SomeEvent someEvent)
   {
       // Handle the event of course
   }
}

我的目標是更改Register方法以接受第三個參數Action<IEvent>盡管我發現如果我引用一個方法,則它必須嚴格接受IEvent作為參數。 在Java中,您可以使用<? extends BaseClass> <? extends BaseClass> (自我解釋),是否有類似Action<? : IEvent> Action<? : IEvent>還是這根本不可能?

此功能稱為“通用約束”。 您可以這樣表達:

public interface IEventListener<TEvent> where TEvent: IEvent
{
    void Handle(TEvent @event);
}

class MyEventHandler : IEventListener<SomeEvent>
{
   public void Handle(SomeEvent @event)
   {
       // Handle the event of course
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM