2016-10-03 48 views
1

时 “未实现接口成员” 的错误,我有这2个接口:的使用继承

public interface IFilterHelper<T> 
{ 
    void Filter(ISearchModel<T> model, ref IQueryable<T> dbModel); 
} 

public interface ISearchModel<T> 
{ 
    IQueryable<T> GetDBModel(DbContext db); 
} 

而这2个实现

public class UserSearchModel : ISearchModel<ApplicationUser> 
{   
    public IQueryable<ApplicationUser> GetDBModel(DbContext db) 
    { 
     return db.Users.Where(u => true); //something like this 
    } 
} 

public class UserFilterHelper : IFilterHelper<ApplicationUser> 
{ 
    public void Filter(UserSearchModel model, ref IQueryable<ApplicationUser> dbModel) 
    { 
    } 
} 

但是我得到的错误'UserFilterHelper' does not implement interface member 'IFilterHelper<ApplicationUser>.Filter(ISearchModel<ApplicationUser>, ref IQueryable<ApplicationUser>)'

但当我更改UserSearchModelISearchModel<ApplicationUser>,它编译成功。我知道我可以投它并让它起作用,但为什么它会给我那个错误。正如你所看到的,UserSearchModel类实现了接口ISearchModel<ApplicationUser>。我错过了什么?

回答

4

该接口明确要求ISearchModel<ApplicationUser>,即使UserSearchModel实施ISearchModel<ApplicationUser>它不是唯一可以的。我可以创建一个类SuperUserSearchModel也可以实现相同的接口。

所以试图写public void Filter(UserSearchModel model, ref IQueryable<ApplicationUser> dbModel)意味着你正在限制接口的实现。

为了使它工作,你就必须设计自己的界面是这样的:

public interface IFilterHelper<T, R> where R : ISearchModel<T> 
{ 
    void Filter(R model, ref IQueryable<T> dbModel); 
} 

public class UserFilterHelper : IFilterHelper<ApplicationUser, UserSearchModel> 
{ 
    public void Filter(UserSearchModel model, ref IQueryable<ApplicationUser> dbModel) 
    { 
    } 
} 
+0

非常感谢。现在,我读了你的答案,我看到我错了。再次感谢。 –

0

你UserFilterHelper在过滤方法错误类型参数:

public class UserFilterHelper : IFilterHelper<ApplicationUser> { 

public void Filter(ISearchModel<ApplicationUser> /* Not UserSearchModel */ model, ref IQueryable<ApplicationUser> dbModel) 
{ 
} 

}

您仍将通过“UserSearchModel”作为参数。它只是方法签名,要求它是ISearchModel

+0

请阅读最后一段。 –

+0

我会说@Enigmativity有更好的方法。但这两种方式都可以工作。 – Van

+0

因为接口签名需要ISearchModel ,而不管实现它的是谁或谁。签名必须是ISearchModel 。为了解决这个问题,你必须做什么Enigmativity建议 – Van