public static IEnumerable <TemplateIntermediateType> SearchForClassDerivatives(TemplateIntermediateType t, ResolutionContext ctxt) { if (!(t is ClassType || t is InterfaceType)) { throw new ArgumentException("t должно быть классом или интерфейсом, но не " + (t != null ? t.ToString() : "null")); } var f = new ClassInterfaceDerivativeFinder(ctxt); f.typeNodeToFind = t.Definition; var bt = t; while (bt != null) { f.alreadyResolvedClasses.Add(bt.Definition); bt = DResolver.StripMemberSymbols(bt.Base) as TemplateIntermediateType; } var filter = MemberFilter.Classes; if (t is InterfaceType) // -> Only interfaces can inherit interfaces. Interfaces cannot be subclasses of classes. { filter |= MemberFilter.Interfaces; } f.IterateThroughScopeLayers(t.Definition.Location, filter); return(f.results); // return them. }
public static IEnumerable<TemplateIntermediateType> SearchForClassDerivatives(TemplateIntermediateType t, ResolutionContext ctxt) { if (!(t is ClassType || t is InterfaceType)) throw new ArgumentException ("t is expected to be a class or an interface, not " + (t != null ? t.ToString () : "null")); var f = new ClassInterfaceDerivativeFinder (ctxt); f.typeNodeToFind = t.Definition; var bt = t; while (bt != null) { f.alreadyResolvedClasses.Add (bt.Definition); bt = DResolver.StripMemberSymbols (bt.Base) as TemplateIntermediateType; } var filter = MemberFilter.Classes; if (t is InterfaceType) // -> Only interfaces can inherit interfaces. Interfaces cannot be subclasses of classes. filter |= MemberFilter.Interfaces; f.IterateThroughScopeLayers (t.Definition.Location, filter); return f.results; // return them. }