我已按以下方式设置了我的课程。 因此,两个集合都实现了一个通用接口 - IChild。
有没有办法让父母的方法返回每个集合的公共部分?
我在下面使用“+”,我知道这不起作用,但它表明我正在尝试做什么。
public interface IChild
{
DateTime Date { get; }
Parent Parent { get; set; }
}
public class Boy : IChild
{
public virtual Parent Parent { get; set; }
public virtual DateTime GraduationDate { get; set; }
public virtual DateTime Date { get { return ProcedureDate; } }
}
public class Girl : IChild
{
public virtual Parent Parent { get; set; }
public virtual DateTime WeddingDate { get; set; }
public virtual DateTime Date { get { return ContactDate; } }
}
public Parent
{
protected IList<Boy> _boys = new List<Boy>();
protected IList<Girl> _girls = new List<Girl>();
public virtual IEnumerable<Boy> Boys
{
get { return _boys; }
}
public virtual IEnumerable<Girl> Girls
{
get { return _girls; }
}
public virtual IEnumerable<IChild> Children
{
get
{
return _boys + _girls;
}
}
}
由于
答案 0 :(得分:3)
public virtual IEnumerable<IChild> Children
{
get
{
return _boys.Concat<IChild>(_girls);
}
}
答案 1 :(得分:2)
您可以使用Cast<T>
强制转换为接口,然后使用Concat
将一个序列流式传输到另一个接口。
return _boys.Cast<IChild>().Concat(_girls.Cast<IChild>()); // .NET 3.5 and greater
注意:如果您使用的是.NET 3.5,则需要执行此处所示的强制转换。如果您使用的是.NET 4,则可以关注Kristian Fenn's answer并省略代替.Concat<IChild>
的强制转换,因为它们在.NET 4版本中提供了IEnumerable<T>
协变,这允许{当方法调用IEnumerable<Boy>
时,要替换{1}}。
IEnumerable<IChild>
为了完成,如果你仍然使用.NET 2.0,那么这两种方法都不适用,尽管实现自己很简单。
return _boys.Concat<IChild>(_girls); // .NET 4.0 and greater
答案 2 :(得分:0)
在结果集合中,您是否只需要常用元素?
你可以考虑重载+运算符
答案 3 :(得分:0)
public virtual IEnumerable<IChild> Children
{
get
{
List<IChild> list = new List<IChild>();
list.AddRange(Boys);
list.AddRange(Girls);
return list;
}
}