public static IEnumerable<ZenjectResolveException> ValidateContract(DiContainer container, InjectContext context) { var matches = container.GetProviderMatches(context); if (matches.Count == 1) { foreach (var error in matches.Single().ValidateBinding(context)) { yield return error; } } else { if (ReflectionUtil.IsGenericList(context.MemberType)) { var subContext = context.ChangeMemberType(context.MemberType.GetGenericArguments().Single()); matches = container.GetProviderMatches(subContext); if (matches.IsEmpty()) { if (!context.Optional) { if (container.FallbackProvider != null) { foreach (var error in container.FallbackProvider.ValidateBinding(context)) { yield return error; } } else { yield return new ZenjectResolveException( "Could not find dependency with type 'List<{0}>'{1}. If the empty list is also valid, you can allow this by using the [InjectOptional] attribute.' \nObject graph:\n{2}" .Fmt( subContext.MemberType.Name(), (context.ObjectType == null ? "" : " when injecting into '{0}'".Fmt(context.ObjectType.Name())), context.GetObjectGraphString())); } } } else { foreach (var match in matches) { foreach (var error in match.ValidateBinding(context)) { yield return error; } } } } else { if (!context.Optional) { if (matches.IsEmpty()) { if (container.FallbackProvider != null) { foreach (var error in container.FallbackProvider.ValidateBinding(context)) { yield return error; } } else { yield return new ZenjectResolveException( "Could not find required dependency with type '{0}'{1} \nObject graph:\n{2}" .Fmt( context.MemberType.Name(), (context.ObjectType == null ? "" : " when injecting into '{0}'".Fmt(context.ObjectType.Name())), context.GetObjectGraphString())); } } else { yield return new ZenjectResolveException( "Found multiple matches when only one was expected for dependency with type '{0}'{1} \nObject graph:\n{2}" .Fmt( context.MemberType.Name(), (context.ObjectType == null ? "" : " when injecting into '{0}'".Fmt(context.ObjectType.Name())), context.GetObjectGraphString())); } } } } }