通过反射获取所有ICollection属性我试图从一个未知类型的类中获取所有ICollection属性。此外,类型T(集合的内容)在编译时是未知的。首先我尝试了这种方法://做点什么}}但它不起作用(即使对于ICollection属性也计算为false)。我让它像这样工作:foreach(varpropertyinentity.GetType().GetProperties()){vargetMethod=property.GetGetMethod();vartest=getMethod.Invoke(entity,null);if(testisICollection){//dosomething}}但是我不想执行所有的getter。为什么第一段代码不起作用?如何在不执行所有getter的情况下找到ICollection属性?事实证明,使用IsAssignableFrom检查您无法确定接口是否是另一个接口的派生:Console.WriteLine(typeof(ICollection).IsAssignableFrom(typeof(ICollection)));Console.WriteLine(typeof(ICollection).IsAssignableFrom(typeof(ICollection)));会错的;在这里没有帮助,这是我可以获得的最佳解决方案:staticIEnumerableGetICollectionOrICollectionOfTProperties(thisTypetype){//获取PropertyType声明为接口的属性varinterfaceProps=frompropintype.GetProperties()frominterfaceTypeinprop.PropertyType.GetInterfaces()whereinterfaceType.IsGenericTypeletbaseInterface=interfaceType.GetGenericTypeDefinition()where(baseInterface==typeof(ICollection))||(baseInterface==typeof(ICollection))选择道具;//获取PropertyType声明(可能)为实体类型的属性。varnonInterfaceProps=frompropintype.GetProperties()其中typeof(ICollection).IsAssignableFrom(prop.PropertyType)||typeof(ICollection).IsAssignableFrom(prop.PropertyType)选择道具;//将两个查询组合成一个结果returninterfaceProps.Union(nonInterfaceProps);这个解决方案可能会产生一些重复(几乎不可能,但一定要使用Distinct),它看起来不太好,但它适用于具有接口返回类型和具体返回类型属性的类:classCollections{publicListListTProp{get;放;}publicIDictionaryIDictionaryProp{get;放;}公共ICollectionICollectionProp{得到;放;}publicICollectionIDateTimeCollectionProp{get;放;在尝试使用已接受的答案后,我遇到了只返回部分匹配项的情况。我的对象有3个ICollection属性,我只返回2个。我花了一些时间测试并试图找出原因,但我继续写了这个:publicstaticIEnumerableGetICollectionProperties(objectentity){returnentity.GetType()GetProperties().Where(p=>p.PropertyType.IsGenericType&&p.PropertyType.GetGenericTypeDefinition()==typeof(ICollection));我已经用相同的测试用例进行了测试,并且我从这个方法返回了正确的结果。这不会获取非通用ICollections,但OP确实要求ICollection属性,尽管它很容易被重新考虑包含在内。它也不会返回不完全属于ICollection类型的属性(即,Eugene的List和IDictionary不会在他的测试用例中返回(但同样,这是OP想要的))。以上就是C#学习教程:通过反射获取所有ICollection属性共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
