Example #1
0
        public static Tuple <MethodInfo, XRoadServiceAttribute> FindMethodDeclaration(this MethodInfo method, string operationName, IDictionary <MethodInfo, IDictionary <string, XRoadServiceAttribute> > serviceContracts)
        {
            if (method.DeclaringType == null)
            {
                return(null);
            }

            var methodContracts = method.DeclaringType
                                  .GetTypeInfo()
                                  .GetInterfaces()
                                  .Select(iface => method.DeclaringType.GetTypeInfo().GetRuntimeInterfaceMap(iface))
                                  .Where(map => map.TargetMethods.Contains(method))
                                  .Select(map => map.InterfaceMethods[Array.IndexOf(map.TargetMethods, method)])
                                  .ToList();

            if (methodContracts.Count > 1)
            {
                throw XRoadException.AmbiguousMatch(operationName);
            }

            var methodContract = methodContracts.SingleOrDefault();

            if (methodContract == null || !serviceContracts.TryGetValue(methodContract, out var serviceContract))
            {
                throw XRoadException.UndefinedContract(operationName);
            }

            if (!serviceContract.TryGetValue(operationName, out var serviceAttribute))
            {
                throw XRoadException.UndefinedContract(operationName);
            }

            return(Tuple.Create(methodContract, serviceAttribute));
        }