static CodeMemberMethod XF(int args) { var t = new CodeTypeReference("System.Linq.Expressions.Expression", Types.Func(args)); var m = CreateMethod("XF", t, "expr", args, true); m.Comments.AddDocs( XmlDocs.TypeParams(m.TypeParameters, t), XmlDocs.Param("expr", "The " + XmlDocs.See(t) + " to return."), XmlDocs.Summary("Creates a " + XmlDocs.See(t) + " expression tree."), XmlDocs.Returns("Returns <paramref name=\"expr\" />.") ); return(m); }
static CodeMemberMethod F(int args) { var t = Types.Func(args); var m = CreateMethod("F", t, "lambda", args, true); m.Comments.AddDocs( XmlDocs.TypeParams(m.TypeParameters, t), XmlDocs.Param("lambda", "The " + XmlDocs.See(t) + " to return."), XmlDocs.Summary("Creates a " + XmlDocs.See(t) + " delegate."), XmlDocs.Returns("Returns <paramref name=\"lambda\" />.") ); return(m); }
static CodeMemberMethod RecFunc(int args) { var t = Types.Func(args); var m = new CodeMemberMethod() { Attributes = MemberAttributes.Static | MemberAttributes.Public, Name = "RecFunc", ReturnType = t, }; m.TypeParameters.AddRange(Types.GetTypeParameters(args, true).ToArray()); var a = "lambda"; m.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference("Func", t, t), a)); m.Statements.ThrowWhenArgumentIsNull(a); var expr = AppendArgs(new StringBuilder(), args); expr.Append(" => lambda (RecFunc (lambda))"); AppendArgs(expr, args); m.Statements.Add(new CodeMethodReturnStatement(new CodeSnippetExpression(expr.ToString()))); m.Comments.AddRange("From: http://blogs.msdn.com/madst/archive/2007/05/11/recursive-lambda-expressions.aspx"); m.Comments.AddDocs( XmlDocs.TypeParams(m.TypeParameters, t), XmlDocs.Param("lambda", "The " + XmlDocs.See(t) + " to use."), XmlDocs.Summary("Creates a " + XmlDocs.See(t) + " delegate, which may be recursive."), XmlDocs.Returns("Returns a " + XmlDocs.See(t) + " which (eventually) invokes <paramref name=\"lambda\"/>."), XmlDocs.ArgumentNullException("lambda"), XmlDocs.Remarks( "<para>", " The following example makes use of a recursive lambda:", "</para>", "<code lang=\"C#\">", " Func<int, int> factorial = Lambda.RecFunc<int, int> (".Replace("<", "<"), " fac => x => x == 0 ? 1 : x * fac (x-1));", " Console.WriteLine (factorial (5)); // prints \"120\"", "</code>" ) ); return(m); }