aneira elegante de ler uma propriedade filho de um obje

Diga que está tentando ler esta propriedade

var town = Staff.HomeAddress.Postcode.Town;

Em algum lugar ao longo da cadeia um nulo poderia existir. Qual seria a melhor maneira de ler Town?

Eu tenho experimentado alguns métodos de extensão ...

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));

o

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);

Obviamente, eles estão apenas abstraindo a lógica e tornando o código (um pouco) mais legíve

Mas existe uma maneira melhor / mais eficiente?

EDITAR

No meu caso específico, os objetos estão sendo retornados de um serviço WCF e não tenho controle sobre a arquitetura desses objeto

EDIT 2:

Existe também 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);
    }
}

deste artigohttp: //qualityofdata.com/2011/01/27/nullsafe-dereference-operator-in-c

questionAnswers(11)

yourAnswerToTheQuestion