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 && [email protected](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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage