Wie verwende ich Expression Tree, um sicher auf den Pfad nullfähiger Objekte zuzugreifen?

Wenn ich ein deserialisiertes XML-Ergebnis in einen von xsd generierten Objektbaum bekomme und ein tiefes Objekt in diesem Baum a.b.c.d.e.f verwenden möchte, gibt es eine Ausnahme, wenn ein Knoten in diesem Abfragepfad fehlt.

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

Ich möchte vermeiden, für jede Ebene wie folgt auf null zu prüfen:

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

ie erste Lösung besteht darin, die Erweiterungsmethode Get zu implementieren, die dies ermöglich

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

ie zweite Lösung besteht darin, die Erweiterungsmethode Get (string) zu implementieren und Reflection zu verwenden, um ein Ergebnis zu erhalten, das wie folgt aussieht:

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

Die dritte Lösung könnte darin bestehen, ExpandoObject zu implementieren und einen dynamischen Typ zu verwenden, damit das Ergebnis so aussieht:

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

Aber die letzten beiden Lösungen bieten keine Vorteile durch starkes Tippen und IntelliSense.

Ich denke, das Beste könnte die vierte Lösung sein, die mit Expression Trees implementiert werden kann:

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

ode

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

Ich habe bereits die 1. und 2. Lösung implementiert.

Hier sieht die 1. Lösung aus:

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

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

    return ret;
}

Wie kann die 4. Lösung implementiert werden, wenn dies möglich ist?

Auch wäre es interessant zu sehen, wie die dritte Lösung implementiert werden kann, wenn dies möglich ist.