/// <summary> /// Resolves child properties of an object through the engine /// </summary> /// <typeparam name="T">Any class</typeparam> /// <param name="o">The object to resolve the properties of</param> /// <param name="resolutionPackage">Information to be used when resolving types</param> /// <returns>The passed in object with resolved properties (just in case)</returns> public static T ResolveProperties <T>(T o, ResolutionPackage resolutionPackage) { if (resolutionPackage is null) { throw new ArgumentNullException(nameof(resolutionPackage)); } Type oType = o.GetType(); if (!ChildDependencies.ContainsKey(oType)) { ChildDependencies.TryAdd(oType, oType.GetProperties().Where(p => Attribute.IsDefined(p, typeof(DependencyAttribute))).ToList()); } foreach (PropertyInfo thisDependency in ChildDependencies[oType]) { if (!AnyRegistration(thisDependency.PropertyType)) { Type defaultType = thisDependency.GetCustomAttribute <DependencyAttribute>().Default; thisDependency.SetValue(o, Resolve( new Registration() { ServiceProvider = typeof(TransientServiceProvider), RegisteredType = thisDependency.PropertyType, ToInstantiate = defaultType ?? thisDependency.PropertyType }, resolutionPackage).SingleOrDefault()); } else { thisDependency.SetValue(o, Resolve(thisDependency.PropertyType, resolutionPackage, true)); } } return(o); }