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); } } }
internal static IEnumerable <TBase> GetBaseImplementations <TBase, TWrapper>(params object[] args) where TBase : class, IDependencyBase where TWrapper : TBase, IWrapper { var baseTypes = TaleWorlds.Core.Extensions.DistinctBy(DI.GetAllTypes() .Where(t => t.IsAbstract || t.IsInterface) .Where(t => ReflectionUtils.ImplementsOrImplementsEquivalent(t, typeof(TBase), false)), t => t.FullName); foreach (var baseType in baseTypes) { if (baseType == typeof(TWrapper)) { continue; } var implementation = GetImplementation(baseType, typeof(TWrapper), args); if (implementation is TBase @base) { yield return(@base); } } }
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); } } }
internal static IEnumerable <TBase> GetBaseImplementations <TBase>(params object[] args) where TBase : class, IDependencyBase { var baseTypes = TaleWorlds.Core.Extensions.DistinctBy(DI.GetAllTypes() .Where(t => t.IsAbstract || t.IsInterface) .Where(t => ReflectionUtils.ImplementsOrImplementsEquivalent(t, typeof(TBase), false)), t => t.FullName); foreach (var baseType in baseTypes) { var wrapper = baseType.Assembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract) .FirstOrDefault(t => typeof(IWrapper).IsAssignableFrom(t) && baseType.IsAssignableFrom(t)); if (wrapper == null) { continue; } var implementation = GetImplementation(baseType, wrapper, Version, args); if (implementation is TBase @base) { yield return(@base); } } }
public static IEnumerable <ISettingsPropertyDefinition> GetProperties(object @object) { var settingPropertyDefinitionsDiscoverers = DI.GetBaseImplementations <ISettingsPropertyDiscoverer>(); return(settingPropertyDefinitionsDiscoverers.SelectMany(d => d.GetProperties(@object))); }