コード例 #1
0
        private bool TryResolve(ConstructorInfo constructor, out Func <IServiceResolver, object> callSite)
        {
            callSite = null;
            var parameters = constructor.GetParameters();
            var reflector  = constructor.GetReflector();

            if (parameters.Length == 0)
            {
                callSite = resolver => reflector.Invoke();
                return(true);
            }
            var parameterResolvers = new Func <IServiceResolver, object> [parameters.Length];

            for (var i = 0; i < parameters.Length; i++)
            {
                var parameter   = parameters[i];
                var serviceType = parameter.ParameterType;
                if (!_serviceTable.Contains(serviceType))
                {
                    if (!parameter.HasDefaultValue)
                    {
                        return(false);
                        //throw new InvalidOperationException($"Cannot resolve parameter '{parameter.Name}:{parameter.ParameterType}' for '{constructor}'");
                    }
                    var defaultValue = parameter.DefaultValue;
                    parameterResolvers[i] = resolver => defaultValue;
                }
                else
                {
                    parameterResolvers[i] = resolver => resolver.Resolve(serviceType);
                }
            }
            callSite = resolver =>
            {
                var args = new object[parameterResolvers.Length];
                for (var i = 0; i < args.Length; i++)
                {
                    args[i] = parameterResolvers[i](resolver);
                }
                return(reflector.Invoke(args: args));
            };
            return(true);
        }