【发布时间】:2013-05-05 18:21:51
【问题描述】:
我有一个基类:
public abstract class DomainEventSubscriber<T> where T : DomainEvent
{
public abstract void HandleEvent(T domainEvent);
public Type SubscribedToEventType() { return typeof(T); }
}
还有一个存储DomainEventSubscriber 引用的类:
public class DomainEventPublisher
{
private List<DomainEventSubscriber<DomainEvent>> subscribers;
public void Subscribe<T>(DomainEventSubscriber<T> subscriber)
where T : DomainEvent
{
DomainEventSubscriber<DomainEvent> eventSubscriber;
eventSubscriber = (DomainEventSubscriber<DomainEvent>)subscriber;
if (!this.Publishing)
{
this.subscribers.Add(eventSubscriber);
}
}
}
即使 Subscribe 方法类型受到限制,我也无法从 DomainEventSubscriber<T> subscriber where T : DomainEvent 转换为 DomainEventSubscriber<DomainEvent>:
eventSubscriber = (DomainEventSubscriber<DomainEvent>)subscriber;
我将如何进行这种转换,或者我是否正在为讨厌的代码气味做准备?
【问题讨论】:
-
你需要一个带有
值的接口。不知道你是否可以在这里这样做。 -
尽管如此,值得将
out粘贴到public abstract class DomainEventSubscriber<out T> where T : DomainEvent以查看它是否有效。 -
@MatthewWatson 这将永远起作用,因为
out和in泛型类型修饰符只能用于接口,不能用于类。 -
@Virtlink 很公平,也许他可以尝试将其设为接口!
-
你的设计有缺陷。您试图让自己能够将简单的
DomainEvent实例发送到HandleEvent(MyDomainEvent)方法,这将永远无法工作。编译器做得很好,可以保护您不这样做。