是否有好的方法来清除ICollection<;T>;而不知道T

本文关键字:lt gt 不知道 ICollection 方法 清除 是否 | 更新日期: 2023-09-27 18:20:48

我有一个各种项目类型的集合列表。该列表被键入为List<IEnumerable>;因为IEnumerable是来自ICollection<T>的唯一非通用接口,并且我需要在该列表中添加例如ICollection<Contact>ICollection<Partnership>集合。

稍后,在实体实用程序代码中,我需要清除集合。到目前为止,我找到的唯一解决方案是:

collection.GetType().GetInterface("ICollection`1").InvokeMember("Clear",
        BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
        null,
        collection,
        new object[0]);

还有什么比我更优雅的吗?

是否有好的方法来清除ICollection<;T>;而不知道T

如果您被ICollection<T>限制为最低类型,那么没有太多选项。涉及DLR的一个不那么冗长的实现是使用dynamic并键入它:

    static void Main(string[] args)
    {
        var listOfLists = new List<IEnumerable>();
        var names = new List<string>();
        var ages = new List<int>();
        listOfLists.Add(names);
        listOfLists.Add(ages);
        foreach (dynamic list in listOfLists)
        {
            list.Clear();
        }
    }

或者,您可以对可能实现的接口进行假设,并测试定义了Clear的接口:

        foreach (var list in listOfLists)
        {
            if (list is IList)
            {
                (list as IList).Clear();
            }
        }

如果可以进入类型层次结构,请创建自己的集合使用的接口,并定义自己的Clear

这主要是一个问题,因为.NET 2.0之前的集合和接口与.NET 2.0集合和接口不太协调。

您可以为业务类使用通用接口,如IObject(甚至可能是object类)。试试这个:

class Program
{
    static void Main(string[] args)
    {
        var list = new MyList();
        var contacts = new ContactCollection();
        var partnerships = new PartnershipCollection();
        contacts.Add(new Contact());
        partnerships.Add(new Partnership());
        list.Add(contacts);
        list.Add(partnerships);
        list.ClearCollections();
    }
    class MyList : List<ICollection<IObject>>
    {
        public void ClearCollections()
        {
            this.ForEach((a) => a.Clear());
        }
    }
    interface IObject { }
    class Contact : IObject { }
    class Partnership : IObject { }
    class ContactCollection : ICollection<IObject> { }
    class PartnershipCollection : ICollection<IObject> { }
}

为什么需要使用反射?由于CCD_ 12接口包括CCD_。

所以简单的

ICollection collection = new List<Something>();
collection.Clear();

将执行