实体中的集合 - 您正确使用它的方法是什么?

时间:2015-04-23 16:32:52

标签: c# collections interface

所以,我认为在大型项目中,至少有一部分人以这种方式定义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;?

0 个答案:

没有答案