/// <summary> /// Get method signature of invoked method. It will be resolved with /// generic arguments while the method is invoked. /// </summary> /// <param name="method">Method to get resolved signature.</param> /// <param name="methodDef">Method definition of method parameter.</param> /// <returns> /// Method signature with generic parameters resolved, e.g., List<string> /// Generic parameters are resolved to argument values. /// </returns> public static string GetResolvedMethodSignature(this MethodReference method, MethodDefinition methodDef) { string typeSignature = GetResolvedTypeSignature(method.DeclaringType); string methodSignature; if (method.Name.StartsWith(GetPrefix)) { methodSignature = $"{method.Name.Substring(GetPrefix.Length)}.get"; } else if (method.Name.StartsWith(SetPrefix)) { methodSignature = $"{method.Name.Substring(SetPrefix.Length)}.set"; } else { methodSignature = method.Name; } if (method.IsGenericInstance) { GenericInstanceMethod genericInstance = (GenericInstanceMethod)method; var genericParameters = genericInstance.GenericArguments.Select(genericArgument => genericArgument.GetResolvedTypeSignature()); methodSignature = genericParameters.Count() != 0 ? $"{methodSignature}<{string.Join(",", genericParameters)}>" : methodSignature; } IList <string> parameters = new List <string>(); if (method.IsGenericInstance) { GenericInstanceMethod genericInstanceMethod = (GenericInstanceMethod)method; for (int i = 0; i < method.Parameters.Count; i++) { ParameterDefinition parameter = method.Parameters[i]; ParameterDefinition parameterOfMethodDef = methodDef.Parameters[i]; TypeReference resolvedParameterType = parameter.GetTypeWithGenericResolved(genericInstanceMethod); if (resolvedParameterType.IsByReference) { ByReferenceType byReference = resolvedParameterType as ByReferenceType; string prefix; if (parameterOfMethodDef.IsOut) { prefix = "out"; } else if (parameterOfMethodDef.IsIn) { prefix = "in"; } else { prefix = "ref"; } parameters.Add($"{prefix}{byReference.ElementType.GetResolvedTypeSignature()}"); } else if (parameterOfMethodDef.IsParams()) { parameters.Add($"params{resolvedParameterType.GetResolvedTypeSignature()}"); } else { parameters.Add(resolvedParameterType.GetResolvedTypeSignature()); } } } else { for (int i = 0; i < method.Parameters.Count; i++) { ParameterDefinition parameter = method.Parameters[i]; ParameterDefinition parameterOfMethodDef = methodDef.Parameters[i]; TypeReference resolvedParameterType = parameter.GetTypeWithGenericResolved(); if (resolvedParameterType.IsByReference) { ByReferenceType byReference = resolvedParameterType as ByReferenceType; string prefix; if (parameterOfMethodDef.IsOut) { prefix = "out"; } else if (parameterOfMethodDef.IsIn) { prefix = "in"; } else { prefix = "ref"; } parameters.Add($"{prefix}{byReference.ElementType.GetResolvedTypeSignature()}"); } else if (parameterOfMethodDef.IsParams()) { parameters.Add($"params{resolvedParameterType.GetResolvedTypeSignature()}"); } else { parameters.Add(resolvedParameterType.GetResolvedTypeSignature()); } } } return($"{typeSignature}.{methodSignature}({string.Join(",", parameters)})"); }