private static void UpdateDependencies() { var interfaces = DI.GetAllTypes() .Where(t => t.IsAbstract || t.IsInterface) .Where(t => t.GetInterfaces(false).Any(i => i.FullName == typeof(IDependency).FullName)); foreach (var @interface in interfaces) { var types = DI.GetAllTypes() .Where(t => t.IsClass && !t.IsAbstract) .Where(t => ReflectionUtils.ImplementsOrImplementsEquivalent(t, @interface)); var tuple = VersionUtils.GetLastImplementation(Version, types); if (tuple != null && tuple.Value.Type != null) { LatestImplementations.Add(@interface, tuple.Value.Type); } } }
/// <summary> /// Foolproofing. Custom implementations can be wrapped, but we can't be sure if they are correct. /// Do checking until we find the first correct one /// </summary> private static object?GetImplementationRecursive(Type baseType, Type wrapperType, object[] args, IEnumerable <Type> types) { var tuple = VersionUtils.GetLastImplementation(Version, types); if (tuple == null || tuple?.Type == null) { return(null); } var obj = Activator.CreateInstance(tuple?.Type, args); if (baseType.IsAssignableFrom(tuple?.Type)) { return(obj); } else { var wrapperObject = Activator.CreateInstance(wrapperType, obj); return(wrapperObject is IWrapper wrapper && wrapper.IsCorrect ? wrapperObject : GetImplementationRecursive(baseType, wrapperType, args, types.Where(t => t != tuple?.Type))); } }
private static void UpdateDependencies() { LatestImplementations.Clear(); var bases = DI.GetAllTypes() .Where(t => t.IsAbstract || t.IsInterface) .Where(t => t.GetInterfaces(false).Any(i => i.FullName() == typeof(IDependency).FullName()) && t.GetInterfaces(true).All(i => FullName(i) != typeof(IWrapper).FullName())) .Select(i => i.FullName()) .Distinct(); foreach (var @base in bases) { var types = DI.GetAllTypes() .Where(t => t.IsClass && !t.IsAbstract) .Where(t => ReflectionUtils.ImplementsOrImplementsEquivalent(t, @base)); var tuple = VersionUtils.GetLastImplementation(Version, types); if (tuple != null && tuple.Value.Type != null) { LatestImplementations.Add(@base, tuple.Value.Type); } } }