A possibly-terrible alternative to conditionals full of null checks
I tend to use monads in such situations:

public static TResult With&lt;TSource, TResult&gt;(this TSource source, Func&lt;TSource, TResult&gt; action)
    where TSource : class
{
    if (source == null) return default(TResult);
    return action(source);
}

public static TSource Do&lt;TSource&gt;(this TSource source, Action&lt;TSource&gt; action)
    where TSource : class
{
    if (source != null)
    {
        action(source);
    }
    return source;
}


And then:

c.With(x =&gt; x.Class2).With(x =&gt; x.Class3).With(x =&gt; x.AProperty).Do(x =&gt; "Yay!".Dump());