创建一个ienumerableinterface从一堆ICollection'
本文关键字:Implementation ICollection 一个 ienumerableinterface 创建 一堆 | 更新日期: 2023-09-27 18:10:37
我有一个由许多集合组成的类,如下所示:
public virtual ICollection<C> CStuff { get; set; }
public virtual ICollection<D> DStuff { get; set; }
public virtual ICollection<E> EStuff { get; set; }
每个类型实现一个公共接口。
public class C : IStuff {}
public class D : IStuff {}
public class E : IStuff {}
我想创建一个集合所有的东西在我的类,像这样:
IEnumerable<IEnumerable<IStuff>> AllStuffCollections
{
get { /* how??? */ }
}
public IEnumerable<IStuff> AllStuff
{
get
{
foreach (IEnumerable<IStuff> stuffCollection in AllStuffCollections)
{
foreach (IStuff stuff in stuffCollection)
{
yield return stuff;
}
}
}
}
是否有任何方法来完成这一点(反射的OK)没有添加每个集合显式?例如,我不想这样做:
IEnumerable<IEnumerable<IStuff>> AllStuffCollections
{
get
{
return new List<IEnumerable<IStuff>>()
{
CStuff.Cast<IStuff>,
DStuff.Cast<IStuff>,
EStuff.Cast<IStuff>
}
}
}
随着时间的推移,这个类将添加更多的IStuff
集合,我担心我会忘记在AllStuffCollections
中包含它们。
此外,集合本身是懒惰的(ef填充),所以我不想做任何会强制立即"查询所有事物"发生的事情。
如果反射是OK的,并且你不介意它的性能,你可以这样实现它:
public IEnumerable<IEnumerable<IStuff>> GetStuffCollections()
{
var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var property in properties)
{
Type pt = property.PropertyType;
if (pt.IsGenericType
&& pt.GetGenericTypeDefinition() == typeof(ICollection<>)
&& typeof(IStuff).IsAssignableFrom(pt.GetGenericArguments()[0]))
{
yield return (IEnumerable<IStuff>)property.GetValue(this);
}
}
}