Как использовать Expression Tree для безопасного доступа к путям обнуляемых объектов?

Когда я получу десериализованный результат XML в сгенерированное xsd дерево объектов и захочу использовать какой-то глубокий объект внутри этого дерева a.b.c.d.e.f, это даст мне исключение, если какой-либо узел в этом пути запроса отсутствует.

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

Я хочу избежать проверки на нулевое значение для каждого уровня, как это:

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

Первое решение заключается в реализации метода расширения Get, который позволяет:

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

Второе решение - реализовать метод расширения Get (string) и использовать отражение, чтобы получить результат, похожий на этот:

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

Третье решение может заключаться в реализации ExpandoObject и использовании динамического типа для получения результата, похожего на это:

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

Но последние 2 решения не дают преимуществ строгой типизации и IntelliSense.

Я думаю, что лучшим может быть четвертое решение, которое может быть реализовано с помощью деревьев выражений:

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

или же

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

Я уже реализовал 1 и 2 решения.

Вот как выглядит 1-е решение:

[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;
}

Как реализовать 4-е решение, если это возможно?

Также было бы интересно посмотреть, как реализовать 3-е решение, если это возможно.

Ответы на вопрос(1)

Ваш ответ на вопрос