Using _ as an extension method

In C#, as in many other languages, “_” is a valid identifier (as reminded to me by Erik Meijer on a C9 Lecture)

Recently, I used this knowledge to create the following extension method:

    public static class StringExt {

        public static XElement _(this string s,

                            params object[] objs) {

            return new XElement(s, objs);

        }

    }

Why? To enable this coding style

            "html"._(

                "body"._(

                    "table"._(

                        "tr"._(

                            from colName in colNames

                            select "th"._(colName)),

                        from e in seq

                        select "tr"._(

                            from f in colFuncs

                            select "td"._( f(e))))))

            .Save(name);           

The above fragment creates an HTML document containing a table, where:

  • IEnumerable<T> seq is a sequence of elements, where each element corresponds to a table row.
  • List<string> colNames is a sequence of column names
  • Linked<Func<T, string>> colFuncs is a sequence of functions, where each function is used to project one sequence element (e) into a column cell.

Without extension methods, this fragment would be written as:

    new XElement("html",

         new XElement("body",

            new XElement("table",

                new XElement("tr",

                    from colName in colNames

                    select new XElement("th", colName)),

                from e in seq

                select new XElement("tr",

                    from f in colFuncs

                    select new XElement("td", f(e))))))

    .Save(name);

More “noisier”, on my opinion.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s