protected virtual MethodBuilder DefineMethod(TypeBuilder type, string name, MethodAttributes attributes, TypeData returnType, TypedNodeList arguments) { MethodBuilder method = type.DefineMethod(name, attributes, returnType.RawType, arguments.NodeTypes); ParameterInfo[] parameters = new ParameterInfo[arguments.Length]; ArrayList parameterList = new ArrayList(); foreach (Argument arg in arguments) { ParameterAttributes attrs = 0; switch (arg.Mode) { case ArgumentMode.Out: attrs |= ParameterAttributes.Out; break; case ArgumentMode.InOut: attrs |= ParameterAttributes.In; attrs |= ParameterAttributes.Out; break; } ParameterBuilder pb = method.DefineParameter(arg.Index, attrs, arg.Name); Type[] cparamTypes = new Type[] { typeof(ArgumentMode) }; ConstructorInfo constructor = typeof(ArgumentModeAttribute).GetConstructor(cparamTypes); CustomAttributeBuilder cbuilder = new CustomAttributeBuilder(constructor, new object[] { arg.Mode }); pb.SetCustomAttribute(cbuilder); parameters[arg.Index - 1] = new Parameter(pb, arg.NodeType.RawType, method); ArgumentModeAttribute attr = new ArgumentModeAttribute(arg.Mode); typeManager.AddCustomAttribute(parameters[arg.Index - 1], attr); UserDefinedParameterData paramData = new UserDefinedParameterData(typeManager, parameters[arg.Index - 1], arg.Mode); parameterList.Add(paramData); } UserDefinedMethodData methodData = typeManager.AddMethod(type, method); typeManager.AddParameters(method, parameters); methodData.Parameters = parameterList; return method; }