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); }
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); } }
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); }
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); }
protected static bool CanResolveParameter(string parameterName, Type parameterType, ParametersOverloads parameters, Options options) { // TODO: return(false); }