My last post, 'more fun with yield return' described a simple method I'd added to a Contact class to iterate its properties (all strings) and only return those that were not null or empty. It was a nice use of the 'yield return' statement to build a custom iterator. I got a good comment from Ken Egozi who thought that I was putting UI code in my entity. He's right of course, the entity is not the right place for stuff like this. So I started thinking about creating a UI method to build the list and then a generic UI method for building a list of any entity's properties. It was getting pretty funky, with LineBuilder<T> and all kinds of crazy functional stuff, but a couple of refactorings later and all my code evaporated leaving just an array initializer and a Linq Where clause. How about this...
using System; using System.Linq; namespace Mike.PropertyRenderer { class Program { static void Main(string[] args) { var contact = new Contact { Firstname = "Mike", Lastname = "Hadlow", Address1 = "3 Nicely Avenue", Country = new Country { Name = "UK" } }; foreach (var s in new []{ contact.Firstname, contact.Lastname, contact.Address1, contact.Address2, contact.Address3, contact.Town, contact.County, contact.Postcode, contact.Country.Name} .Where(line => !string.IsNullOrEmpty(line))) { Console.WriteLine(s); } Console.ReadLine(); } } public class Contact { public string Firstname { get; set; } public string Lastname { get; set; } public string Address1 { get; set; } public string Address2 { get; set; } public string Address3 { get; set; } public string Town { get; set; } public string County { get; set; } public string Postcode { get; set; } public Country Country { get; set; } } public class Country { public string Name { get; set; } } }
gives this:
I've definitely spent enough time on this now :P
If you're formatting value objects for the UI, how about serialising to hCard? You can go on forever with this stuff..
ReplyDelete