示例#1
0
        protected static bool IsMatch(Info info, ParametersOverloads parameters, Options options)
        {
            foreach (var parameter in info.GetParameters())
            {
                if (string.IsNullOrEmpty(parameter.Name))
                {
                    return(false);
                }

                var isParameterOverload = parameters.ContainsKey(parameter.Name);
                if (!isParameterOverload)
                {
                    if (parameter.ParameterType.IsPrimitive())
                    {
                        return(false);
                    }

                    if (!CanResolveParameter(parameter.Name, parameter.ParameterType, parameters, options))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
示例#2
0
        public Constructor(Type typeToConstruct, ParametersOverloads parameters, ConstructorOptions options = null) :
            base(typeToConstruct, null)
        {
            if (parameters == null)
            {
                ConstructorInfo = GetDefaultConstructor(typeToConstruct);
            }
            else
            {
                ConstructorInfo = GetBestConstructor(typeToConstruct, parameters, options);
            }

            if (ConstructorInfo == null)
            {
                ConstructorException.Raise(typeToConstruct);
            }
        }
示例#3
0
        protected static Info GetBestMatch(IEnumerable <Info> methods, ParametersOverloads parameters, Options options = null)
        {
            // Get methods in reverse order based on the number of parameters
            // i.e. be as "greedy" as possible so we satify the most amount of dependencies possible
            //var ordered = methods.OrderByDescending(info => info.GetParameters().Count());
            var ordered = from m in methods
                          orderby m.GetParameters().Count() descending
                          select m;

            foreach (var method in ordered)
            {
                if (IsMatch(method, parameters, options))
                {
                    return(method);
                }
            }

            return(null);
        }
示例#4
0
        protected object[] GeArguments(ParametersOverloads parameters, Options options)
        {
            Debug.AssertNotNull(_Info);
            var methodParams = _Info.GetParameters();
            int paramsCount  = methodParams.Count();

            object[] args = new object[paramsCount];

            for (int parameterIndex = 0; parameterIndex < paramsCount; parameterIndex++)
            {
                var param = methodParams[parameterIndex];

                if (parameters.ContainsKey(param.Name))
                {
                    args[parameterIndex] = parameters[param.Name];
                }
                else
                {
                    args[parameterIndex] = ResolveParameter(param.Name, param.ParameterType, parameters, options);
                }
            }

            return(args);
        }
示例#5
0
 protected static bool CanResolveParameter(string parameterName, Type parameterType, ParametersOverloads parameters, Options options)
 {
     // TODO:
     return(false);
 }