private static void ImplementInterfaceMethod(TypeBuilder newType, MethodInfo interfaceMethod)
{
var parameters = interfaceMethod.GetParameters();
var parameterTypes = (from p in parameters select p.ParameterType).ToArray();
var newMethod = newType.DefineMethod(interfaceMethod.DeclaringType.Name + "." + interfaceMethod.Name,
MethodAttributes.Private | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final,
interfaceMethod.ReturnType, parameterTypes);
var baseMethod = newType.BaseType.GetMethod(interfaceMethod.Name, parameterTypes);
// parameter 0 is 'this', so we start at index 1
for (int i = 0; i < parameters.Length; i++)
{
newMethod.DefineParameter(i + 1, parameters[i].Attributes, parameters[i].Name);
}
// load all arguments (including 'this') in proper order, then call and return
var ilGenerator = newMethod.GetILGenerator();
for (int i = 0; i <= parameterTypes.Length; i++)
{
ilGenerator.Emit(OpCodes.Ldarg_S, (byte)i);
}
ilGenerator.Emit(OpCodes.Call, baseMethod);
ilGenerator.Emit(OpCodes.Ret);
// finally, hook the new method up to the interface mapping
newType.DefineMethodOverride(newMethod, interfaceMethod);
}