C#通用方法声明
我试图创建的泛型方法的签名有问题 课程安排如下:C#通用方法声明,c#,generics,inheritance,C#,Generics,Inheritance,我试图创建的泛型方法的签名有问题 课程安排如下: public class MarketDataRepository : IRepository { MarketWatchEntities _dbContext = new MarketWatchEntities(); public MarketDataRepository(){} public MarketDataRepository(MarketWatchEntities dbContext) {
public class MarketDataRepository : IRepository
{
MarketWatchEntities _dbContext = new MarketWatchEntities();
public MarketDataRepository(){}
public MarketDataRepository(MarketWatchEntities dbContext)
{
_dbContext = dbContext;
}
public IEnumerable<T> GetMarketData<T>(DateTime startDateTime, DateTime endDateTime ) where T : MarketDataPoint
{
return _dbContext.MarketDataPoints.Where(x => x.ReferenceDateTime >= startDateTime && x.ReferenceDateTime <= endDateTime).ToList();
}
}
public interface IRepository
{
IEnumerable<T> GetMarketData<T>(DateTime startDateTime, DateTime endDateTime) where T : MarketDataPoint;
}
我希望这是可以的,因为我限制T
从MarketDataPoint
继承。所以,我想我可以返回MarketDataPoint
的IEnumerable
任何关于上述问题和我应该做什么的建议都将不胜感激
解决方案(谢谢大家):
公共类MarketDataMarketDataRepository:IMarketDataRepository
{
MarketWatchEntities_dbContext=新的MarketWatchEntities();
public MarketDataMarketDataRepository(){}
公共MarketDataMarketDataRepository(MarketWatchEntities dbContext)
{
_dbContext=dbContext;
}
公共IQueryable GetMarketData(DateTime startDateTime,DateTime endDateTime),其中T:MarketDataPoint
{
return _dbContext.MarketDataPoints.Where(x=>x.ReferenceDateTime>=startDateTime&&x.ReferenceDateTime这不起作用的原因是t
可能比MarketDataPoint
更具体
如果您有一个从MarketDataPoint
派生的类S
,并且有人调用GetMarketData
,那么当您只有MarketDataPoint
的集合时,您如何给他们一个IEnumerable
编辑:正如Matt自己指出的那样,您可以链接对of type()
的调用,该调用将删除非T
元素,并返回正确类型的IEnumerable
return _dbContext.MarketDataPoints
.Where(
x => x.ReferenceDateTime >= startDateTime &&
x.ReferenceDateTime <= endDateTime)
.OfType<T>()
.ToList();
return\u dbContext.MarketDataPoints
.在哪里(
x=>x.ReferenceDateTime>=startDateTime&&
x、 ReferenceDateTime这不起作用的原因是t
可能比MarketDataPoint
更具体
如果您有一个从MarketDataPoint
派生的类S
,并且有人调用GetMarketData
,那么当您只有MarketDataPoint
的集合时,您如何给他们一个IEnumerable
编辑:正如Matt自己指出的那样,您可以链接对of type()
的调用,该调用将删除非T
元素,并返回正确类型的IEnumerable
return _dbContext.MarketDataPoints
.Where(
x => x.ReferenceDateTime >= startDateTime &&
x.ReferenceDateTime <= endDateTime)
.OfType<T>()
.ToList();
return\u dbContext.MarketDataPoints
.在哪里(
x=>x.ReferenceDateTime>=startDateTime&&
x、 ReferenceDateTime如果您遵循错误并手动强制转换它IEnumerable
public IEnumerable GetMarketData(DateTime startDateTime,DateTime endDateTime),其中T:MarketDataPoint
{
return(IEnumerable)_dbContext.MarketDataPoints.Where(x=>x.ReferenceDateTime>=startDateTime&&x.ReferenceDateTime,如果您跟踪错误并手动强制转换它IEnumerable
public IEnumerable GetMarketData(DateTime startDateTime,DateTime endDateTime),其中T:MarketDataPoint
{
return(IEnumerable)\ u dbContext.MarketDataPoints.Where(x=>x.ReferenceDateTime>=startDateTime&&x.ReferenceDateTime为什么要将GetMarketData方法放入IRepository界面?闻起来像是设计中的一个突破。你完全正确。这将最终成为iMarketData存储库从IRepository扩展而来。为什么要将GetMarketData方法放入IRepository界面ce?闻起来像是你设计中的一个突破。你完全正确。这将最终成为IMarketDataRepository从iPostory扩展而来。是的-这是有效的。谢谢,我不知道为什么我没有想到;-)@LightStriker如果你用从MarketDataPoint
派生的东西称之为t
,这将在运行时失败。(我没有忘记你,因为我自己也犯了同样的错误!)@罗琳:是的……这就是为什么我会在其中添加一些类型检查,但在不知道MarketDataPoint的预期设计或他从中期望的确切内容的情况下,无法制定一个完整的防弹答案。是的-这很有效。谢谢,不确定我为什么没有想到;-)@LightStriker如果您使用从MarketDataPoint
派生的东西将其称为T
,则在运行时将失败。(我没有告诉您,因为我自己也犯了同样的错误!)@罗琳:是的……这就是为什么我会在其中添加一些类型检查,但在不知道MarketDataPoint的预期设计或他从中的预期的情况下,无法制定一个完整的防弹答案。是的,你说得很对。我想我以后可能需要扩展这个方法来使用typeof(T)所以我想提前声明,但现在我可以按照你的建议去做。@Matt我的第一个答案是错误的,我已经改变了它,但是现在如果你只有MarketDataPoint
s要处理,那么就让这个方法非泛型。@Rawling:通过检查表中的元素是T类型还是IsAssigableFrom(typeof(T))来实现。这样,此方法将始终返回所请求的类型T并过滤掉错误的类型。@Rawling:谢谢您的澄清。现在您已经解释了这一点,这似乎很明显;-)我想最好的选择是选择类型为S的市场数据点,然后将列表转换为IEnumerable?@Matt是的,这是类型()的
方法,我已经忘记了:)是的,你说得很对。我想我以后可能需要扩展这个方法来使用typeof(T)所以我想提前声明,但现在我可以按照你的建议去做。@Matt我的第一个答案是错误的,我已经改变了它,但是现在如果你只有MarketDataPoint
s要处理,那么就让这个方法非泛型。@Rawling:通过检查表中的元素是T类型还是IsAssigableFrom(typeof(T))来实现。这样,此方法将始终返回所请求的类型T并过滤掉错误的类型。@Rawling:谢谢您的澄清。这一点在y
public IEnumerable<T> GetMarketData<T>(DateTime startDateTime, DateTime endDateTime) where T : MarketDataPoint
{
return (IEnumerable<T>)_dbContext.MarketDataPoints.Where(x => x.ReferenceDateTime >= startDateTime && x.ReferenceDateTime <= endDateTime).ToList();
}