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)); }