0

作成しようとしているジェネリック メソッドのシグネチャに問題があります。

クラスは次のとおりです。

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

追加情報:
MarketWatchEntitiesextends DbContext(Entity Framework によって生成されます)。

このコンパイル時の例外が発生します。

Cannot implicitly convert type 'System.Collections.Generic.List<MarketWatcher.Domain.MarketDataPoint>' to 'System.Collections.Generic.IEnumerable<T>'. An explicit conversion exists (are you missing a cast?)

Tから継承するように制約していることに基づいて、これは問題ないと思っていましたMarketDataPointIEnumerableだから、私はofを返すことができると思いましたMarketDataPoint

上記の何が問題なのか、代わりに何をすべきかについての指針をいただければ幸いです。

解決策(みんなありがとう):

public class MarketDataMarketDataRepository : IMarketDataRepository
{
    MarketWatchEntities _dbContext = new MarketWatchEntities();

    public MarketDataMarketDataRepository(){}

    public MarketDataMarketDataRepository(MarketWatchEntities dbContext)
    {
        _dbContext = dbContext;
    }

    public IQueryable<T> GetMarketData<T>(DateTime startDateTime, DateTime endDateTime ) where T : MarketDataPoint
    {
        return _dbContext.MarketDataPoints.Where(x => x.ReferenceDateTime >= startDateTime && x.ReferenceDateTime <= endDateTime).OfType<T>();
    }
}
4

2 に答える 2

5

これが機能しない理由は、より具体的Tになる可能性があるためです。MarketDataPoint

Sから派生したクラスがMarketDataPointあり、誰かが を呼び出している場合、 のコレクションしか持っていないときにGetMarketData<S>、どうすればそれらに を与えることができますか?IEnumerable<S>MarketDataPoint

編集: マット自身が指摘しているOfType<T>()ように、非T要素取り除き、正しいタイプの を返す への呼び出しを連鎖させることができますIEnumerable

return _dbContext.MarketDataPoints
    .Where(
        x => x.ReferenceDateTime >= startDateTime &&
        x.ReferenceDateTime <= endDateTime)
    .OfType<T>()
    .ToList();
于 2012-11-02T08:08:22.827 に答える
0

そして、エラーに従って手動でキャストした場合はIEnumerable<T>

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

問題はIEnumerable<MarketDataPoint>、 と同じではないことですIEnumerable<T>

于 2012-11-02T08:10:41.080 に答える