在非泛型类之上实现泛型

时间:2014-01-17 13:15:59

标签: c# generics

我有两个由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类由非泛型类组成的方式 - 我觉得它们应该继承非泛型版本。但是,当然,从实体框架接收的实体属于基类,而不是派生的泛型类,因此需要某种转换才能将其转换为基类(理想情况下,我希望将它转换为基类)子类型,但我不认为这是可能的。)

有没有更好的方法来实现这个“非泛型类的通用层”解决方案。

0 个答案:

没有答案