[英]C# Generic Method T Class T Override
在C#中,我有一个通用类,如下所示:
public class DataManager<T> : IDisposable where T : class
这样使用:
public T GetById(String id)
{
return this.Context.Set<T>().Find(id);
}
这很好。
但是,如果我在管理器中有2种类型(在这种情况下为Ticket和TicketResponse),我希望能够重写类型,而不必将类型添加到每个方法调用中。 像这样:
public T GetById<T>(String id) where T : class
{
return this.Context.Set<T>().Find(id);
}
我可以这样互换地称呼它:
var ticket = GetById(myId);
var ticketResponse = GetById<TicketResponse>(myId); // this would override
这样做的想法是不必为子对象创建单独的管理器,也不必不必花费整个票证就可以遍历响应,而只能直接获得它。
这可能吗?
由于Context.Set
允许您指定所需的任何T
,因此您可以为DataManager
类添加一个接口,添加一个在基础上下文中公开方法的基类,然后在您的管理器类上显式实现该接口:
public interface IDataManager<T> : IDisposable where T : class
{
T GetById(string id);
}
public class DataManagerBase : IDisposable
{
protected Find<T>(string id) where T : class
{
return this.Context.Set<T>().Find(id);
}
}
public class TicketManager : DataManagerBase, IDataManager<TicketResponse>, IDataManager<Ticket>
{
TicketResponse IDataManager<TicketResponse>.GetById(string id)
{
return this.Find<TicketResponse>(id);
}
Ticket IDataManager<Ticket>.GetById(string id)
{
return this.Find<TicketResponse>(id);
}
}
您可以尝试这样的事情:
public T GetById( String id )
{
return GetById<T>( id );
}
public U GetById<U>( String id ) where U : T
{
return this.Context.Set<U>().Find( id );
}
因此,您既有原始方法,又有其他通用方法,可以采用从T
派生的另一种参数类型。
如果我对您的理解正确,那么Ticket
是一种特殊情况: Ticket
的DataManager 还应该提供TicketResponse
方法。 那是对的吗?
在这种情况下,您可以仅DataManager<T>
并添加所需的功能:
class TicketManager : DataManager<Ticket>
{
public TicketResponse GetResponseById(String id)
{
return this.Context.Set<TicketResponse>().Find(id);
}
}
可以如下使用:
var ticket = myTicketManager.GetById(myId);
var ticketResponse = myTicketManager.GetResponseById(myId);
(如果您担心GetById
代码的重复,只需将其提取到受静态保护的GetByIdInternal<TData>
方法中即可。)
您可以使用封装两个 DataManager的包装器:
class DataAndResponseManager<TData, TResponse>
{
private dataManager = new DataManager<TData>();
private responseManager = new DataManager<TResponse>();
public TData GetById(String id) { dataManager.GetById(id); }
public TResponse GetResponseById(String id) { responseManager.GetById(id); }
}
优点:重用所有现有的DataManager代码。
缺点:需要代理方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.