private Type GenerateEvent(Type eventHandlerType)
{
string typeName;
lock(this)
{
typeName = "LuaGeneratedClass" + luaClassNumber;
luaClassNumber++;
}
// Define a public class in the assembly, called typeName
TypeBuilder myType=newModule.DefineType(typeName,TypeAttributes.Public,eventHandlerParent);
// Defines the handler method. Its signature is void(object,<subclassofEventArgs>)
Type[] paramTypes = new Type[2];
paramTypes[0]=typeof(object);
paramTypes[1]=eventHandlerType;
Type returnType=typeof(void);
MethodBuilder handleMethod=myType.DefineMethod("HandleEvent",
MethodAttributes.Public|MethodAttributes.HideBySig,
returnType,paramTypes);
// Emits the IL for the method. It loads the arguments
// and calls the handleEvent method of the base class
ILGenerator generator=handleMethod.GetILGenerator( );
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldarg_1);
generator.Emit(OpCodes.Ldarg_2);
MethodInfo miGenericEventHandler;
miGenericEventHandler=eventHandlerParent.GetMethod("handleEvent");
generator.Emit(OpCodes.Call,miGenericEventHandler);
// returns
generator.Emit(OpCodes.Ret);
// creates the new type
return myType.CreateType();
}