代码之家  ›  专栏  ›  技术社区  ›  Paritosh

泛型方法,获取不明确的调用错误

  •  1
  • Paritosh  · 技术社区  · 10 年前

    我正在使用存储库模式,并试图构建一个通用方法,因为我有几个对象以相同的方式从它们的存储库中提取:

    我的存储库的创建方式如下:

    public interface IEntityRepository<T> : IDisposable
    
    public interface IAuditorRepository : IEntityRepository<Auditor>
    
    public class AuditorRepository : IAuditorRepository
    

    审计员类别定义如下:

    public class BaseEntity : IObjectWithState
    
    public partial class Auditor : BaseEntity
    

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

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

    但我一直在上出错。其中指出这是一个模棱两可的引用。所有存储库都实现All方法,例如AuditorRepository版本:

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

    IEntityRepostory定义为:

        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 回复  |  直到 10 年前
        1
  •  3
  •   Jämes    10 年前

    正如我最初所想,由于lambda表达式 x => x.isActive 无效,因为缺少变量的定义 isActive 在课堂上 BaseEntity (类用作方法中类型参数的约束 GetItems ).

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

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

    在我的上下文中, notDefined 未定义,同时引发Where扩展方法上的不明确调用错误。一旦lambda表达式固定(例如。 o != null ),不再引发错误。

    此不明确调用错误与其他匹配方法的屏幕截图。

    enter image description here