Элементы в Bars
не удаляются, поскольку вы возвращаете новый список в получателе IBars
:
return Bars.Cast<IBar>().ToList(); // ToList creates a new list.
Вы не можете конвертировать *От 1008 * до ICollection<IBar>
без создания чего-то нового, поскольку универсальный параметр в ICollection
является инвариантным.
Единственное, что вы можете здесь сделать, - это добавить метод Remove
в IFoo
:
void RemoveIBar(IBar ibar);
И реализовать это так в Foo
:
public void RemoveIBar(IBar ibar) {
if (ibar is Bar) {
Bars.Remove((Bar)ibar);
} else {
throw new NotImplementedException();
}
}
Также проверка в установщике IBars
является избыточной.
Очевидно, что это не тип-безопасный.Более безопасным для этого типом было бы заставить IFoo
принимать универсальный параметр TBar
и иметь ICollection<TBar>
.Foo
может затем реализовать IFoo<Bar>
:
public interface IFoo<TBar> where TBar: IBar
{
int Id { get; set; }
string Name { get; set; }
ICollection<TBar> TBars{ get; set; } //association with another entity
}
public class Foo : IFoo<Bar>
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Bar> Bars{ get; set; }
}
Но я думаю, это считается как IFoo
, зная о Bar
.