有没有一种很好的方法来清除ICollection <T>而不知道T?

jnm*_*nm2 3 .net c# generics

我有各种项目类型的集合列表.列表输入为List<IEnumerable>; 因为IEnumerable是唯一的非通用接口ICollection<T>,我需要在此列表中添加eg ICollection<Contact>ICollection<Partnership>collections.

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

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

我可以使用更优雅的东西吗?

Ada*_*rth 9

如果您受到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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

        foreach (var list in listOfLists)
        {
            if (list is IList)
            {
                (list as IList).Clear();
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

这主要是一个问题,因为pre -.NET 2.0集合和接口与.NET 2.0集合和接口不能很好地融合.