是否可以将接口指定为不同接口的泛型集合属性的类型,然后使用特定类实现它?这是我想要做的一个例子:
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(...)
之类的操作。
答案 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; }
}