From c1820f1a8261f85309237d112f2d1b73fbc74d7d Mon Sep 17 00:00:00 2001 From: de4dot Date: Thu, 3 Nov 2011 22:53:04 +0100 Subject: [PATCH] Add method to replace generic params with generic args. The code only handles basic cases, eg. T -> int, but not T[] -> int[]. --- blocks/DotNetUtils.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/blocks/DotNetUtils.cs b/blocks/DotNetUtils.cs index a4d04fa6..23f79a37 100644 --- a/blocks/DotNetUtils.cs +++ b/blocks/DotNetUtils.cs @@ -782,5 +782,26 @@ namespace de4dot.blocks { return Instruction.Create(OpCodes.Ldc_I4_S, (sbyte)value); return Instruction.Create(OpCodes.Ldc_I4, value); } + + // Doesn't fix everything (eg. T[] aren't replaced with eg. int[], but T -> int will be fixed) + public static IList replaceGenericParameters(GenericInstanceType typeOwner, GenericInstanceMethod methodOwner, IList types) { + for (int i = 0; i < types.Count; i++) + types[i] = getGenericArgument(typeOwner, methodOwner, types[i]); + return types; + } + + public static TypeReference getGenericArgument(GenericInstanceType typeOwner, GenericInstanceMethod methodOwner, TypeReference type) { + var gp = type as GenericParameter; + if (gp == null) + return type; + + if (typeOwner != null && MemberReferenceHelper.compareTypes(typeOwner.ElementType, gp.Owner as TypeReference)) + return typeOwner.GenericArguments[gp.Position]; + + if (methodOwner != null && MemberReferenceHelper.compareMethodReferenceAndDeclaringType(methodOwner.ElementMethod, gp.Owner as MethodReference)) + return methodOwner.GenericArguments[gp.Position]; + + return type; + } } }