Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#通用方法声明_C#_Generics_Inheritance - Fatal编程技术网

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();
}