Можно ли указать интерфейс как тип универсального свойства коллекции другого интерфейса, а затем реализовать его с помощью определенного класса? Вот пример того, что я пытаюсь сделать:
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, но я хотел бы реализовать ICollection с использованием электронной почты вместо IEmail. В настоящее время я получаю сообщение об ошибке:
Ошибка 1 «Пользователь» не реализует элемент интерфейса «IMembershipPrincipal.Emails». «User.Emails» не может реализовать «IMembershipPrincipal.Emails», поскольку он не имеет соответствующего типа возвращаемого значения «System.Collections.Generic.ICollection».
Как изменить определение IMembershipPrincipal, чтобы его можно было реализовать с помощью ICollection<Email>
?
Просто для ясности: я понимаю, что реализация виртуальной коллекции как ICollection<IEmail>
приведет к сборке кода, но это уничтожит мои пути в Entity framework, так что я не смогу сделать что-то вроде MyUser.Emails.Where(...)
.
ICollection<T>
не является ковариантным, поэтому вы не можете добавить экземплярEmail
кICollection<IEmail>
. Это по дизайну. - person MarcinJuraszek   schedule 18.02.2014Add
. - person MarcinJuraszek   schedule 18.02.2014