创建一个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填充),所以我不想做任何会强制立即"查询所有事物"发生的事情。

创建一个ienumerableinterface从一堆ICollection<Implementation>'

如果反射是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);
        }
    }
}