ICollection在与另一个接口的接口中作为类型

时间:2014-02-18 01:18:55

标签: c# entity-framework

是否可以将接口指定为不同接口的泛型集合属性的类型,然后使用特定类实现它?这是我想要做的一个例子:

public interface IMembershipPrincipal
{
    int ID { get; set; }
    string UserName { get; set; }
    ICollection<IEmail> Emails { get; set; }
}

public interface IEmail
{
    string Address { get; set; }
    int UserID { get; set; }
}

并在另一个项目中定义实际的类:

public class User : IMembershipPrincipal
{
    [Key]
    public int ID { get; set; }
    public string UserName { get; set; }
    public virtual ICollection<Email> Emails { get; set; }
}

public class Email : IEmail
{
    [Key]
    public string Address { get; set; }
    public int UserID { get; set; }
}

在IMembershipPrincipal中我只能访问IEmail定义,但我想使用Email而不是IEmail来实现ICollection。我目前收到的错误是:

  

错误1'用户'未实现接口成员'IMembershipPrincipal.Emails'。 'User.Emails'无法实现'IMembershipPrincipal.Emails',因为它没有匹配的返回类型'System.Collections.Generic.ICollection'。

如何更改我的IMembershipPrincipal定义,以便可以使用ICollection<Email>实现?

为了清楚起见,我理解将虚拟集合实现为ICollection<IEmail>将使代码构建,但它会破坏我在Entity框架中的路径,因此我无法执行MyUser.Emails.Where(...)之类的操作。

1 个答案:

答案 0 :(得分:2)

正如其他人所提到的,协方差使您无法使用示例中的代码。但是,您可以使用泛型类型和约束来获得所需的效果。

public interface IMembershipPrincipal<T> where T:IEmail
{
    int ID { get; set; }
    string UserName { get; set; }
    ICollection<T> Emails { get; set; }
}

public interface IEmail
{
    string Address { get; set; }
    int UserID { get; set; }
}

public class User : IMembershipPrincipal<Email>
{
    [Key]
    public int ID { get; set; }
    public string UserName { get; set; }
    public virtual ICollection<Email> Emails { get; set; }
}

public class Email : IEmail
{
    [Key]
    public string Address { get; set; }
    public int UserID { get; set; }
}