加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 有没有一种很好的方法可以在不知道T的情况下清除ICollecti

发布时间:2020-12-16 01:55:48 所属栏目:百科 来源:网络整理
导读:我有各种项目类型的集合列表. 该列表被列为List IEnumerablegt ;;因为IEnumerable是ICollection T中唯一的非通用接口,我需要添加例如的ICollection联系与GT;和ICollection伙伴关系此列表中的集合. 稍后,在实体实用程序代码中,我需要清除集合.到目前为止我找
我有各种项目类型的集合列表.
该列表被列为List< IEnumerable&gt ;;因为IEnumerable是ICollection< T>中唯一的非通用接口,我需要添加例如的ICollection<联系与GT;和ICollection<伙伴关系>此列表中的集合.

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

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

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

解决方法

如果受ICollection< T>约束,则选项不多.作为你的最低类型.涉及DLR的一个不那么罗嗦的实现是使用动态和鸭子类型:

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.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读