因此仅公开接口的子集

时间:2014-03-14 17:52:22

标签: c# .net-4.0

我正在使用Entiry Framework 6,我的一个函数将返回Database.SqlQueryDbRawSqlQuery<TElement>输出。DbRawSqlQuery<TElement>。我希望我的类的接口不要对Entity Framework有任何依赖,所以我不想直接返回IEnumerable<T>,但我也希望公开IListSource和{{1接口。

我知道C#没有&#34;鸭子打字&#34;对于接口,所以我不能做

interface IQueryResult<out T> : IEnumerable<T>, IListSource
{    
}

//Elsewhere
public IQueryResult<T> RunQuery<T>()
{
    return this.Database.SqlQuery<T>(GetQuery());
}

我想我必须使用某种包装来解决这个问题,但还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

以下是如何使用包装类

解决此问题的示例
public interface IQueryResult<out T> : IEnumerable<T>, IListSource
{    
}

internal class QueryResultWrapper<T> : IQueryResult<T>
{
    private readonly DbRawSqlQuery<T> _source;

    public QueryResultWrapper(DbRawSqlQuery<T> source)
    {
        _source = source;
    }

    public bool ContainsListCollection
    {
        get { return ((IListSource)_source).ContainsListCollection; }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable)_source).GetEnumerator();
    }

    public IEnumerator<T> GetEnumerator()
    {
        return _source.GetEnumerator();
    }

    public IList GetList()
    {
        return ((IListSource)_source).GetList();
    }
}

然后将调用方法修改为

public IQueryResult<T> CallStoredProcedure<T>(string query)
{
    return new QueryResultWrapper<T>(this.Database.SqlQuery<T>(query));
}