我有两个由Entity Framework生成的非泛型类:
public partial class Event
{
public Event()
{
this.Notifications = new HashSet<Notification>();
}
public int Id { get; private set; }
public string Name { get; private set; }
public string Description { get; private set; }
internal virtual ICollection<Notification> Notifications { get; set; }
}
public abstract partial class Notification
{
private System.Guid Id { get; set; }
public abstract void Deliver(object eventContext);
}
void Deliver(object eventContext)的实现不需要传入特定类型(它们使用反射从eventContext中提取信息),但同时,我希望强制类的用户提供特定类型。为了实现这一点,我决定最好在这些类之上实现一个通用层:
public class Notification<TContext>
{
private Notification internalNotification;
public Notification(Notification notification)
{
if (notification == null)
throw new ArgumentNullException("notification");
this.internalNotification = notification;
}
public void Deliver(TContext context)
{
this.internalNotification.Deliver(context);
}
}
public class Event<TContext> : Event
{
private Event internalEvent;
internal Event(Event evt)
{
if (evt == null)
throw new ArgumentNullException("evt");
this.internalEvent = evt;
}
public IEnumerable<Notification<TContext>> GetNotifications()
{
foreach (var notification in internalEvent.Notifications)
yield return new Notification<TContext>(notification);
}
}
这样,我可以创建类似于此的代码:
public static class Events
{
public static Event<PaymentContext> PaymentEvent()
{
... get Event object from EF...
return new Event<PaymentContext>(event);
}
public static Event<HireContext> EmployeeHiredEvent()
{
.... get Event object from EF...
return new Event<HireContext>(event);
}
}
然后,用户将被强制将适当的类型传递给Deliver(TContext)方法。
这适用于我的情况,但我不喜欢我的通用Notification和Event类由非泛型类组成的方式 - 我觉得它们应该继承非泛型版本。但是,当然,从实体框架接收的实体属于基类,而不是派生的泛型类,因此需要某种转换才能将其转换为基类(理想情况下,我希望将它转换为基类)子类型,但我不认为这是可能的。)
有没有更好的方法来实现这个“非泛型类的通用层”解决方案。