Elegante forma de leer una propiedad secundaria de un objeto

Dice que está intentando leer esta propiedad

var town = Staff.HomeAddress.Postcode.Town;

En algún lugar de la cadena podría existir un valor nulo. ¿Cuál sería la mejor manera de leer Town?

He estado experimentando con un par de métodos de extensión ...

public static T2 IfNotNull<T1, T2>(this T1 t, Func<T1, T2> fn) where T1 : class
{
    return t != null ? fn(t) : default(T2);
}

var town = staff.HomeAddress.IfNotNull(x => x.Postcode.IfNotNull(y=> y.Town));

public static T2 TryGet<T1, T2>(this T1 t, Func<T1, T2> fn) where T1 : class
{
if (t != null)
{
    try
    {
        return fn(t);
    }
    catch{ }
}
return default(T2);
}

var town = staff.TryGet(x=> x.HomeAddress.Postcode.Town);

bviamente, estos solo están abstrayendo la lógica y haciendo que el código (un poco) sea más legible.

¿Pero hay una manera mejor / más eficiente?

EDITAR

n mi caso particular, los objetos se devuelven desde un servicio WCF y no tengo control sobre la arquitectura de esos objetos.

EDIT 2:

También existe este método:

public static class Nullify
{
    public static TR Get<TF, TR>(TF t, Func<TF, TR> f) where TF : class
    {
        return t != null ? f(t) : default(TR);
    }

    public static TR Get<T1, T2, TR>(T1 p1, Func<T1, T2> p2, Func<T2, TR> p3)
        where T1 : class
        where T2 : class
    {
        return Get(Get(p1, p2), p3);
    }

    /// <summary>
    /// Simplifies null checking as for the pseudocode
    ///     var r = Pharmacy?.GuildMembership?.State?.Name
    /// can be written as
    ///     var r = Nullify( Pharmacy, p => p.GuildMembership, g => g.State, s => s.Name );
    /// </summary>
    public static TR Get<T1, T2, T3, TR>(T1 p1, Func<T1, T2> p2, Func<T2, T3> p3, Func<T3, TR> p4)
        where T1 : class
        where T2 : class
        where T3 : class
    {
        return Get(Get(Get(p1, p2), p3), p4);
    }
}

de este artículohttp: //qualityofdata.com/2011/01/27/nullsafe-dereference-operator-in-c

Respuestas a la pregunta(11)

Su respuesta a la pregunta