public static void Main()
var result = a.With(x => x.ValueB as B2).With(x => x.ValueC).With(x => x.ValueD);
Console.WriteLine("Hello World");
public static class Monades
public static TResult With<TSource, TResult>(this TSource source, Func<TSource, TResult> selector) where TSource : class