c# – 有没有一种很好的方法可以在不知道T的情况下清除ICollecti
发布时间:2020-12-16 01:55:48 所属栏目:百科 来源:网络整理
导读:我有各种项目类型的集合列表. 该列表被列为List IEnumerablegt ;;因为IEnumerable是ICollection T中唯一的非通用接口,我需要添加例如的ICollection联系与GT;和ICollection伙伴关系此列表中的集合. 稍后,在实体实用程序代码中,我需要清除集合.到目前为止我找
我有各种项目类型的集合列表.
该列表被列为List< IEnumerable> ;;因为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集合和接口不能很好地融合. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |