CodeTypeMember MakeMember(MethodInfo method) { MethodContext methodContext = new MethodContext(this, method); ParameterInfo[] pars = method.GetParameters(); for(int i = 0; i < pars.Length; i++) { ParamContext parContext = new ParamContext(this, pars[i]); if (parContext.IsWrapped) { if (parContext.Direction == FieldDirection.In) { if (pars[i].ParameterType.IsArray) { UnwrapArrayArgument(methodContext, parContext); } else { UnwrapArgument(methodContext, parContext); } } else { UnwrapRefArgument(methodContext, parContext); } } else { PassArgument(methodContext, parContext); } // If last parameter is 'out' and method returns void if (i == pars.Length - 1 && parContext.Direction == FieldDirection.Out && methodContext.RawReturnType == typeof(void)) { // Placeholder for the parameter methodContext.DoBeforeInvoke.Insert(0, new CodeVariableDeclarationStatement(parContext.WrappedType, parContext.Name)); // Remove the parameter methodContext.WrapperParams.RemoveAt(methodContext.WrapperParams.Count - 1); methodContext.WrappedReturnType = parContext.WrappedType; methodContext.DoAfterInvoke.Add( new CodeMethodReturnStatement( new CodeVariableReferenceExpression(parContext.Name))); } } if (methodContext.WrapperParams.Count == 0) { if (methodContext.Name.StartsWith("Is")) { methodContext.CodeMemberMethod = new CodeMemberProperty(); } if (methodContext.Name.StartsWith("Get")) { methodContext.CodeMemberMethod = new CodeMemberProperty(); methodContext.Name = methodContext.Name.Remove(0, 3); } } return methodContext.Emit(); }