using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Jace.Util
{
    public static class TypeExtensions
    {
        /// 
        /// Get constructor for a given type matching with the parameter types provided.
        /// 
        /// The type for witch a matching constructor must be found.
        /// The types of the parameters of the constructor.
        /// The matching constructor.
        public static ConstructorInfo GetConstructor(this Type type, Type[] parameters)
        {
            IEnumerable constructors =
                type.GetTypeInfo().DeclaredConstructors.Where(c => c.GetParameters().Length == parameters.Length);
            foreach (ConstructorInfo constructor in constructors)
            {
                bool parametersMatch = true;
                ParameterInfo[] constructorParameters = constructor.GetParameters();
                for (int i = 0; i < parameters.Length; i++)
                {
                    if (parameters[i] != constructorParameters[i].ParameterType)
                    {
                        parametersMatch = false;
                        break;
                    }
                }
                if (parametersMatch)
                    return constructor;
            }
            throw new Exception("No constructor was found matching with the provided parameters.");
        }
    }
}