public static object CreateInstance <T>(this Assembly assembly, Type containerType = null)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException(nameof(assembly));
            }

            string typeName = TypeMixins.GetTypeName(typeof(T), containerType);
            Type   type     = assembly.GetType(typeName);

            if (type == null)
            {
                throw new AssemblyCreateInstanceException($"Could not find '{typeName}' in '{assembly.FullName}'");
            }

            foreach (ConstructorInfo ctor in type.GetConstructors().OrderBy(c => c.GetParameters().Length))
            {
                var parameters = ctor.GetParameters();
                if (parameters.All(pi => pi.HasDefaultValue))
                {
                    return(ctor.Invoke(parameters.Select(x => x.DefaultValue).ToArray()));
                }
            }
            throw new AssemblyCreateInstanceException($"Could not find valid constructor for '{typeof(T).FullName}'");
        }
        public static object Resolve <T>(this Assembly assembly, Type containerType = null)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException(nameof(assembly));
            }

            string typeName = TypeMixins.GetTypeName(typeof(T), containerType);
            Type   type     = assembly.GetType(typeName);

            if (type == null)
            {
                throw new AssemblyCreateInstanceException($"Could not find '{typeName}' in '{assembly.FullName}'");
            }


            IServiceProvider provider = DI.GetGlobalServiceProvider(assembly);

            if (provider == null)
            {
                //TODO: Better exception
                throw new AssemblyInvocationException($"Could not find service provider for '{assembly.FullName}'");
            }

            return(provider.GetService(type));
        }
        public static object GetStaticProperty <TContainingType>(this Assembly assembly, string propertyName, Type containerType = null) where TContainingType : class
        {
            if (assembly == null)
            {
                throw new ArgumentNullException(nameof(assembly));
            }
            if (propertyName == null)
            {
                throw new ArgumentNullException(nameof(propertyName));
            }

            string typeName = TypeMixins.GetTypeName(typeof(TContainingType), containerType);
            Type   type     = assembly.GetType(typeName);

            if (type == null)
            {
                throw new AssemblyGetPropertyException($"Could not find '{typeof(TContainingType).FullName}' in '{assembly.FullName}'");
            }

            PropertyInfo property = type.GetProperty(propertyName);

            if (property == null)
            {
                throw new AssemblyGetPropertyException($"Could not find property '{propertyName}' on type '{type.FullName}'");
            }

            if (property.GetMethod == null)
            {
                throw new AssemblyGetPropertyException($"Property '{type.FullName}.{propertyName}' does not have a getter");
            }

            if (!property.GetMethod.IsStatic)
            {
                throw new AssemblyGetPropertyException($"Property '{type.FullName}.{propertyName}' is not static");
            }

            return(property.GetValue(null));
        }