Como usar a Árvore de Expressão para acessar com segurança o caminho de objetos anuláveis?

Quando eu obtiver o resultado XML desserializado na árvore de objetos gerada por xsd e desejar usar algum objeto profundo dentro dessa árvore a.b.c.d.e.f, isso me dará uma exceção se algum nó nesse caminho de consulta estiver ausente.

if(a.b.c.d.e.f != null)
    Console.Write("ok");

Quero evitar a verificação de nulo para cada nível como este:

if(a != null)
if(a.b != null)
if(a.b.c != null)
if(a.b.c.d != null)
if(a.b.c.d.e != null)
if(a.b.c.d.e.f != null)
    Console.Write("ok");

A primeira solução é implementar o método de extensão Get, que permite:

if(a.Get(o=>o.b).Get(o=>o.c).Get(o=>o.d).Get(o=>o.e).Get(o=>o.f) != null)
    Console.Write("ok");

A segunda solução é implementar o método de extensão Get (string) e usar a reflexão para obter resultados parecidos com o seguinte:

if(a.Get("b.c.d.e.f") != null)
    Console.Write("ok");

Terceira solução, poderia ser implementar o ExpandoObject e usar o tipo dinâmico para obter resultados parecidos com o seguinte:

dynamic da = new SafeExpando(a);
if(da.b.c.d.e.f != null)
    Console.Write("ok");

Mas as duas últimas soluções não oferecem benefícios de digitação forte e do IntelliSense.

Eu acho que o melhor poderia ser a quarta solução que pode ser implementada com as Expression Trees:

if(Get(a.b.c.d.e.f) != null)
    Console.Write("ok");

ou

if(a.Get(a=>a.b.c.d.e.f) != null)
    Console.Write("ok");

Eu já implementei 1ª e 2ª soluções.

Aqui está a aparência da 1ª solução:

[DebuggerStepThrough]
public static To Get<From,To>(this From @this, Func<From,To> get)
{
    var ret = default(To);
    if(@this != null && [email protected](default(From)))
        ret = get(@this);

    if(ret == null && typeof(To).IsArray)
        ret = (To)Activator.CreateInstance(typeof(To), 0);

    return ret;
}

Como implementar a quarta solução, se possível?

Também seria interessante ver como implementar a terceira solução, se possível.

questionAnswers(1)

yourAnswerToTheQuestion