[英]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.