private void RegisterResolverClassesMethods() { foreach (var module in _server.Modules) { foreach (var resClass in module.ResolverClasses) { var resClassInfo = new ResolverClassInfo() { Module = module, Type = resClass }; _model.ResolverClasses.Add(resClassInfo); var methods = resClass.GetPublicMethods(); foreach (var m in methods) { var resAttr = m.GetAttribute <ResolvesFieldAttribute>(); var resInfo = new ResolverMethodInfo() { Method = m, Module = module, ResolverClass = resClassInfo, ReturnsTask = m.MethodReturnsTask(), ReturnType = m.GetReturnDataType(), ResolvesAttribute = resAttr }; if (resInfo.ReturnsTask) { resInfo.TaskResultReader = ExpressionHelper.CompileTaskResultReader(m.ReturnType); } _allResolverMethods.Add(resInfo); } } } }
private bool VerifyFieldResolverMethod(FieldDef field, ResolverMethodInfo resolverMethod) { if (!VerifyResolverMethodReturnTypeCompatible(field, resolverMethod.Method)) { return(false); } if (!ValidateResolverMethodArguments(field, resolverMethod)) { return(false); } return(!_model.HasErrors); }
private bool ValidateResolverMethodArguments(FieldDef fieldDef, ResolverMethodInfo resolverMethod) { var resMethod = resolverMethod.Method; // Check first parameter - must be IFieldContext var prms = resMethod.GetParameters(); if (prms.Length == 0 || prms[0].ParameterType != typeof(IFieldContext)) { AddError($"Resolver method {resMethod.GetFullRef()}: the first parameter must be of type '{nameof(IFieldContext)}'."); return(false); } // compare list of field parameters with list of resolver method parameters; // resolver method has extra FieldContext and Parent parameters var argCountDiff = 1; if (!fieldDef.Flags.IsSet(FieldFlags.Static)) { argCountDiff = 2; } var expectedPrmCount = fieldDef.Args.Count + argCountDiff; if (expectedPrmCount != prms.Length) { AddError($"Resolver method {resMethod.GetFullRef()}: parameter count mismatch with field arguments, expected {expectedPrmCount}, " + "with added IFieldContext and possibly Parent object parameter. "); return(false); } // parameter names/types must be identical for (int i = argCountDiff; i < prms.Length; i++) { var prm = prms[i]; var arg = fieldDef.Args[i - argCountDiff]; if (prm.Name != arg.Name || prm.ParameterType != arg.ParamType) { AddError($"Resolver method {resMethod.GetFullRef()}: parameter name/type mismatch with field argument; parameter: {prm.Name}."); return(false); } } return(true); }