private void GenerateIfForEachImplementedBy( MethodBuilder method, ComplexTypeDescriptor complexTypeDescriptor, Func<ObjectTypeDescriptor, IfBuilder> generator) { if (!(complexTypeDescriptor is InterfaceTypeDescriptor interfaceTypeDescriptor) || !interfaceTypeDescriptor.ImplementedBy.Any()) { return; } IEnumerable<ObjectTypeDescriptor> dataTypes = interfaceTypeDescriptor.ImplementedBy.Where(x => x.IsData()); IfBuilder ifChain = generator(dataTypes.First()); foreach (ObjectTypeDescriptor objectTypeDescriptor in dataTypes.Skip(1)) { ifChain.AddIfElse(generator(objectTypeDescriptor).SkipIndents()); } ifChain.AddElse(ExceptionBuilder.New(TypeNames.NotSupportedException)); method.AddCode(ifChain); }