Wenn ich das deserialisierte XML-Ergebnis in den xsd-generierten Baum der Objekte 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.Wie verwende ich Expression Tree, um sicher auf den Pfad von nullfähigen Objekten zuzugreifen?
if(a.b.c.d.e.f != null)
Console.Write("ok");
Ich möchte für null Kontrolle zu vermeiden, für jede Ebene wie folgt aus:
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");
Erste Lösung ist Erweiterung Methode zu implementieren erhalten, die dies ermöglicht:
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");
Zweite Lösung ist Implementieren Sie die Methode "Get (string) extension" und verwenden Sie Reflection, um ein Ergebnis zu erhalten, das wie folgt aussieht:
if(a.Get("b.c.d.e.f") != null)
Console.Write("ok");
dritte Lösung könnte sein ExpandoObject zu implementieren und dynamische Art verwenden, um zur Folge haben wie folgt aussehen zu erhalten:
dynamic da = new SafeExpando(a);
if(da.b.c.d.e.f != null)
Console.Write("ok");
Aber letzten 2 Lösungen nicht Vorteile der starke Typisierung und IntelliSense geben.
ich denke, die beste vierte Lösung sein könnte, die mit Expression Trees umgesetzt werden können:
if(Get(a.b.c.d.e.f) != null)
Console.Write("ok");
oder
if(a.Get(a=>a.b.c.d.e.f) != null)
Console.Write("ok");
ich bereits umgesetzt 1. und 2. Lösungen.
Hier ist, wie erste Lösung sieht so 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 4. Lösung, wenn möglich, implementieren?
Auch wäre es interessant zu sehen, wie die dritte Lösung zu implementieren, wenn möglich.
[Diese Frage] (http://stackoverflow.com/questions/3897249/how-to-avoid-multiple-if-null-checks) hat zwei Links zu Fragen mit Antworten. Einer hängt vom Roslyn-Compiler ab; der andere ist ein einfacher Codeschnipsel, der den Trick macht. –
Ich lese die eigentliche Frage und die Antworten oben adressieren nicht direkt Ihre Frage, aber sind relevant und interessant –
Ich experimentierte mit diesem vor kurzem und vielleicht würde meine Lösung interessierend zu Ihnen sein. Ich habe es [hier] (http://codereview.stackexchange.com/questions/116798/improved-nullguard-v3-that-supports-property-chains-methods-and-ignores-value-t) bei Code Review gepostet. Ich habe meine eigene Implementierung geschrieben, weil ich etwas mehr wollte, das einfach gegen Null geht ;-) Ihre Frage und Servys Antwort haben mich inspiriert, etwas anderes zu versuchen. – t3chb0t