泛型方法,得到模糊的调用错误

时间:2014-07-14 18:58:08

标签: c# asp.net .net generics type-constraints

我正在使用Repository Pattern并且正在尝试构建一个泛型方法,因为我有一些对象以相同的方式从它们的存储库中提取:

我的存储库是以这种方式创建的:

public interface IEntityRepository<T> : IDisposable

public interface IAuditorRepository : IEntityRepository<Auditor>

public class AuditorRepository : IAuditorRepository

Auditor类定义为:

public class BaseEntity : IObjectWithState

public partial class Auditor : BaseEntity

除了AuditorRepository,我还有其他一些如BuildingRepository。现在我正在尝试创建一个通用方法,我可以在其中传递存储库:

    public List<EditSelectItemViewModel> GetItems<T>(IEntityRepository<T> repos) where T : BaseEntity 
    {
        var d = repos.All.Where(x => x.isActive).OrderBy(x => x.Name).Include(z => z.Contracts)
            .Select(y => new EditSelectItemViewModel
            {
                Id = y.Id,
                SourceName = y.Name,
                DisplayOnNew = y.DisplayOnNew,
                NumberOfTimesUsed = y.ActiveContracts.Count(a => a.isActive)
            }).ToList();

        return d;
    }

但是我继续在.Where上得到一个错误,声明这是一个模棱两可的参考。所有存储库都实现All方法,例如下面是AuditorRepository版本:

    public IQueryable<DomainClasses.Auditor> All
    {
        get { return _context.Auditors; }
    }

IEntityRepostiory定义为:

    public interface IEntityRepository<T> : IDisposable
{
    IQueryable<T> All { get; }
    //List<T> AllRequests { get; }
    IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties);
    T Find(params object[] keyValues);
    void InsertOrUpdateGraph(T entityGraph);
    void InsertOrUpdate(T entity);
    void Delete(params object[] keyValues);

}

并且baseEntity为:

    public class BaseEntity : IObjectWithState
{
    public State State { get; set; }
}

国家定义为:

    public interface IObjectWithState
{
    State State { get; set; }
}
public enum State
{
    Added,
    Unchanged,
    Modified,
    Deleted
}

1 个答案:

答案 0 :(得分:3)

正如我最初想的那样,出现了模糊调用错误,因为lambda表达式x => x.isActive无效,因为类isActive中缺少对变量BaseEntity的定义(类用作方法GetItems)中类型参数的约束。

可以使用以下代码重现错误:

(new object[0]).AsQueryable().Where(o => o == notDefined);

在我的上下文中,notDefined未定义,同时引发了Where扩展方法的Ambiguous调用错误。一旦lambda表达式被修复(例如o != null),就不再抛出错误。

此Ambiguous调用错误的屏幕截图以及其他匹配的方法。

enter image description here