private static void CollectImplementedInterfaces(TypeReference type, HashSet <TypeReference> results) { var typeResolver = TypeResolver.For(type); var typeDef = type.Resolve(); foreach (var implementedInterface in typeDef.Interfaces) { var interfaceType = typeResolver.Resolve(implementedInterface.InterfaceType); results.Add(interfaceType); CollectImplementedInterfaces(interfaceType, results); } }
private static void RedirectInterfaceMethods(TypeReference interfaceType, Collection <MethodDefinition> redirectedMethods) { var typeResolver = TypeResolver.For(interfaceType); var typeDef = interfaceType.Resolve(); foreach (var method in typeDef.Methods) { var redirectedMethod = new MethodDefinition(method.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final | MethodAttributes.NewSlot, typeResolver.Resolve(method.ReturnType)); redirectedMethod.ImplAttributes = MethodImplAttributes.Runtime; foreach (var parameter in method.Parameters) { redirectedMethod.Parameters.Add(new ParameterDefinition(parameter.Name, parameter.Attributes, typeResolver.Resolve(parameter.ParameterType))); } redirectedMethod.Overrides.Add(typeResolver.Resolve(method)); redirectedMethods.Add(redirectedMethod); } }