Я думаю, что новая версия намного лучше, если Вы инвертируете, если
static public string ToNonNullString(this XmlAttribute attr)
{
if (attr == null)
return string.Empty;
return attr.Value;
}
, поскольку Ваша исходная версия слишком симметрична, в то время как пустой случай является особым случаем.
Новая версия более читаема в терминах, "что она возвращает большую часть времени?".
Я бы выбрал то, что просто и работает. Я не знаю подробностей, но то, что вы написали, по сравнению с шаблоном Visitor, выглядит проще. Если это также сработает для вас, я бы использовал это. Лично я устал от всех этих техник, которые просят вас создать огромную «сеть» взаимосвязанных классов, просто чтобы решить одну небольшую проблему.
Некоторые скажут, да, но если вы сделаете это с использованием шаблонов, вы можете охватить много будущих потребностей и бла-бла. Я говорю: делайте сейчас то, что работает, и, если возникнет необходимость, вы сможете провести рефакторинг в будущем. В моих проектах такая потребность почти никогда не возникает, но это другая история.