首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性Users和IRepository.Users之间的区别

属性Users和IRepository.Users之间的区别
EN

Stack Overflow用户
提问于 2011-10-09 02:39:30
回答 3查看 69关注 0票数 0

我有一个接口IRepository来抽象我的存储库。DbContext类是一个使用第一个代码的实体框架。

代码语言:javascript
复制
public interface IRepository 
{
    IQueryable<User> Users { get; }
}

public class Repository : DbContext, IRepository
{
    public DbSet<User> Users { get; set; }
    IQueryable<User> IRepository.Users { get{ return Users; } }
}

我不理解Repository类中的User属性user。

这段代码可以编译,我想知道为什么。

属性名称之前的接口名称是什么?

EN

回答 3

Stack Overflow用户

发布于 2011-10-09 02:43:20

这是有效的语法,称为Explicit Interface Implementation。它在两种情况下很有用:

  • 当你用相同的方法实现2个接口时(检查上面的链接)
  • 当你想在某种意义上“隐藏”实现细节时。在您的示例中,如果用户将具有DbContext引用,他将看到DbSet<User>属性并能够访问它,另一方面,如果您只向用户提供IRepository -他将只看到IQueryable<User>,这让您可以隐藏它下面的内容。

//Edit:实际上,还有一个我个人喜欢的用法,也用在我的代码中:

  • 您可以隐藏一些方法/属性,但仍然可以实现它们。例如,Dictionary<K, V>实现了ICollection<KeyValuePair<K, V>>,所以它应该实现带有签名的方法:void Add(KeyValuePair<K, V> kv),这个签名很难看,你更喜欢void Add(K key, V value),但是你不能忽略第一个签名。带有显式int的。实施。您可以实现第一个方法,但对用户隐藏它(至少只要用户不将字典强制转换为ICollection).
票数 4
EN

Stack Overflow用户

发布于 2011-10-09 02:44:31

Repository类中的Users属性具有与接口不同的返回类型。为了满足接口的要求,还从IRepository接口显式地实现了Users属性。

您可以在这里找到关于显式接口实现的更详细的讨论:implicit vs explicit interface implementation

票数 1
EN

Stack Overflow用户

发布于 2011-10-09 02:42:59

它的类型,此属性返回IQueryable的泛型接口。即它是一个特定类型的接口IQueryable,这是为用户一般创建的。

IQueryable是一个接口,但它是IQueryable接口的一个特殊版本,只接受user类型的对象。

请参阅泛型http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx简介

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7698960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档