如何检查一个GenericTypeDefinition是否实现了IEnumerablestaticTypeGetEnumerableType(Typetype){if(type.IsGenericType){vargenericTypeDefinition=type.GetGenericTypeDefinition();如果(genericTypeDefinition==typeof(IEnumerable)){返回类型.GetGenericArguments()[0];}}返回空值;如果它是一个IEnumerable,它就像一个魅力。如果GenericTypeDefinition是IList或List,则它不起作用。我试过..typeof(IEnumerable).IsAssignableFrom(genericTypeDefinition)..没有成功。肯定有比链接其他语句更好的方法吗?您可以使用GetInterfaces检查类型是否实现了IEnumerableTypetype=newList().GetType();如果(type.IsGenericType){vargenericTypeDefinition=type.GetGenericTypeDefinition();如果(genericTypeDefinition.GetInterfaces().Any(t=>t.IsGenericType&&t.GetGenericTypeDefinition()==typeof(IEnumerable))){returntype.GetGenericArguments()[0];我最终深入研究了通用对象处理,发现这种方式比任何最初的假设都更复杂。这是我现在使用的方法:///检查指定的类型是否可枚举。///方式。///IEnumerable{int}将是int//////[可选]如果设置为true[不包括字符串]。字符串可枚举为char[]///这可能不是您想要的。默认为真(字符串将返回假)//////真提供的类型是可枚举的,否则为假publicstaticboolIsEnumerable(thisTypetype,outTypeunderlyingType,boolexcludeString=true){underlyingType=null;如果(type.IsEnum||type.IsPrimitive||type.IsValueType)返回false;如果(excludeString&&type==typeof(string))返回false;if(type.IsGenericType){if(type.IsTypeDefinitionEnumerable()||type.GetInterfaces().Any(t=>t.IsSelfEnumerable()||t.IsTypeDefinitionEnumerable())){underlyingType=type.GetGenericArguments()[0];返回真;}}//IEnumerable的直接实现,继承自List等varenumerableOrNull=type.GetInterfaces().FirstOrDefault(t=>t.IsTypeDefinitionEnumerable());如果(enumerableOrNull==null)返回false;underlyingType=enumerableOrNull.GetGenericArguments()[0];返回真;}//privatestaticboolIsSelfEnumerable(thisTypetype){boolisDirectly=type==typeof(IEnumerable);返回是直接的;}privatestaticboolIsTypeDefinitionEnumerable(thisTypetype){boolisViaInterfaces=type.IsGenericType&&type.GetGenericTypeDefinition().IsSelfEnumerable();返回isViaInterfaces;}该解决方案经过测试:安装包NUnit-Version2.6.4应该安装包[Test]publicvoidList_is_enumerable(){varsut=newList();底层类型;varresult=sut.IsEnumerable(outunderlyingType);结果.ShouldBeTrue();underlyingType.ShouldBe(typeof(int));}//[测试]publicvoidYield_return_is_enumerable(){varsut=Yielded();底层类型;varresult=sut.IsEnumerable(outunderlyingType);结果.ShouldBeTrue();underlyingType.ShouldBe(typeof(int));}privateIEnumerableYielded(){for(inti=0;i//[Test]publicvoidint_is_not_an_enumerable(){varsut=5;TypeunderlyingType;varresult=sut.IsEnumerable(outunderlyingType);result.ShouldBe(false);underlyingType.ShouldBeNull();}[测试]publicvoidobject_is_not_an_enumerable(){varsut=new{foo=1};TypeunderlyingType;varresult=sut.IsEnumerable(outunderlyingType);result.ShouldBe(false);underlyingType.ShouldBeNull();为了后代不符合原题,不过对这里的各位显然有用以上是C#学习教程:HowtocheckwhetherGenericTypeDefinitionimplementsIEnumerable分享所有内容,如果对大家有用需要了解更多关于C#学习教程,希望大家多多关注——publicstaticboolIsA(thisTypetype){returntypeof(T).IsAssignableFrom(type);}本文收集自网络,不代表立场.如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
