只获取直接接口,不是全部?我有一个像下面这样的课程。GetInterfaces()表示如果当前Type表示泛型类型或泛型方法定义中的类型参数,则此方法搜索接口约束以及从类或接口约束继承的任何接口。有没有可能我没有得到任何继承的接口?当我在ABC上使用GetInterfaces时,我只想看到DEF,而不是DEF和GHI。interfaceDEF:GHI{...}classABC:DEF{...}首先,您发布的MSDN片段与您的实际问题无关。例如,它处理泛型类型,例如classFoowhereT:IEnumerable,并尝试在类型参数T上调用GetInterfaces,例如通过typeof(Foo).GetGenericArguments().Single().GetInterfaces()。其次,这个问题有点Obvious。请注意,当一个类实现一个接口时,它必须实现从该接口“继承”的所有接口。在类声明中省略继承接口只是C#的一项便利功能。在您的示例中,明确包含GHI接口的“继承”是完全合法的(并且没有任何区别):classABC:DEF,GHI{...}我假设您真正想做的是找到一个“覆盖”所有类型实现的接口的“最小集”接口。这导致了Setcover问题的一个稍微简化的版本。这是解决它的一种方法,没有试图在算法上有效的方法。这个想法是通过过滤那些已经被该类型实现的其他接口实现的接口来生成最小的接口集。输入type=...varallInterfaces=type.GetInterfaces();varminimalInterfaces=fromiTypeinallInterfaceswhere!allInterfaces.Any(t=>t.GetInterfaces().Contains(iType))选择iType;(编辑——这是一种更好的方法:varminimalInterfaces=allInterfaces.Except(allInterfaces.SelectMany(t=>t.GetInterfaces()));)例如,对于列表:allInterfaces:System.Collections.Generic.IList`1[System.Int32]System.Collections.Generic.ICollection`1[System.Int32]System.Collections.Generic.IEnumerable`1[System.Int32]System.Collections.IEnumerableSystem.Collections.IListSystem.Collections.ICollectionminimalInterfaces:System.Collections.Generic.IList`1[System.Int32]System.Collections.IList请注意,此解决方案仅涵盖接口“层次结构”(这是您想要的),而不是它们与类层次结构的关系。特别是,它不关注接口首先在类层次结构中的哪个位置实现。例如,假设我们有:interfaceIFoo{}interfaceIBar:IFoo{}interfaceIBaz{}classBase:IBar{}classDerived:Base,IBaz{}现在,如果您尝试使用我描述的解决方案来获取Derived的最小集的界面,您将获得IBaz和IBar。如果您不想要IBar,您将不得不付出更多努力:消除由基类实现的接口。最简单的方法是从最小接口集中删除由该类的直接基类实现的接口,如@MikeEast的回答中所述。这里有一篇关于重复问题的好文章:否则返回类型。GetInterfaces().Except(type.BaseType.GetInterfaces());}}用法:foreach(在typeof(Some).GetInterfaces(false)中输入ifc){Console.WriteLine(ifc);}相同的MSDN页面说GetInterfaces方法接口没有按特定顺序返回,例如字母顺序或声明顺序。您的代码不得依赖于返回接口的顺序,因为该顺序可能会有所不同。所以不,你不能跳过接口。接口继承heirachy怎么样?publicstaticMapGetTypeInheritance(Typetype){//获取该类型的所有接口varinterfaces=type.GetInterfaces();//获取祖先接口的所有接口varbaseInterfaces=interfaces.SelectMany(i=>i.GetInterfaces());//仅基于直接接口进行过滤vardirectInterfaces=interfaces.Where(i=>baseInterfaces.All(b=>b!=i));Mapmap=newMap{Node=type,Ancestors=directInterfaces.Select(GetTypeInheritance).ToList()};返回地图;}publicclassMap{publicTypeNode{get;放;}publicListAncestors{get;放;这个问题在这里和这里重复。无论如何,这是我的干净代码,它考虑了@Ani和@Mikael在这个主题上提出的观点:以上是C#学习教程:只获取直接接口而不是全部?如果分享的内容对你有用,需要了解更多C#学习教程,希望大家多多关注——varactualInterfaces=type.GetInterfaces();foreach(varresultinactualInterfaces.Except(type.BaseType?.GetInterfaces()??Enumerable.Empty())//参见https://stackoverflow.com/a/1613936.Except(actualInterfaces.SelectMany(i=>i.GetInterfaces()))//参见https://stackoverflow.com/a/5318781)yield返回结果;本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
