所以,我认为在大型项目中,至少有一部分人以这种方式定义interface
:
public interface IUser
{
//some properties
}
public interface IGroup
{
//some properties
ICollection<IUser> Users {get;set;}
}
然后,在实现此接口之后,您希望以这种方式在项目中的某处调用:
var group = new Group(); // or Container.Resolve<IGroup>();
var user = new user() {name = "john"};
group.Users.Add(user);
但这是不可能的,因为我们无法将List<User>
转换为ICollection<IUser>
(因为协方差和逆变)而不会丢失对Group.Users
属性的引用(使用List.Cast<>
正在返回新对象),因此我们无法使用Add()
之类的方法。
我所知道的最简单,最有效的方法是实现这样的接口IGroup
:
public interface IGroup
{
IEnumerable<IUser> Users {get;set;}
Add(IUser user);
Remove(IUser user);
//all methods that any normal collection has
}
但是这个解决方案很糟糕,因为我们必须在每个对象中实现许多冗余方法,任何集合乘以此集合的数量。
我试图以任何干净和漂亮的方式解决这个问题,尝试实现我自己的集合等等但我找不到。
你有什么方法可以做得更干净一点?你实施ICollection<IUser>
并做一些聪明的事情,或者只是放弃并做`List&#39;?