private static void ImplementConstructor(TypeBuilder newType, ConstructorInfo baseConstructor)
{
var parameters = baseConstructor.GetParameters();
var parameterTypes = parameters.Select(p => p.ParameterType).ToArray();
var constructor = newType.DefineConstructor(MethodAttributes.Public, baseConstructor.CallingConvention, parameterTypes);
// parameter 0 is 'this', so we start at index 1
for (int i = 0; i < parameters.Length; i++)
{
constructor.DefineParameter(i + 1, parameters[i].Attributes, parameters[i].Name);
}
var ilGenerator = constructor.GetILGenerator();
for (int i = 0; i <= parameterTypes.Length; i++)
{
ilGenerator.Emit(OpCodes.Ldarg_S, (byte)i);
}
ilGenerator.Emit(OpCodes.Call, baseConstructor);
ilGenerator.Emit(OpCodes.Ret);
}