using System.Linq.Expressions;
public static void Main()
Console.WriteLine("EO!!!");
var message = new A{B=new B{C=new C()}};
Expression<Func<A,int>> exp = a => a.B.C.N;
var x = exp.CheckForNull("KK D L VK");
var message2 = new A{B=new B()};
Console.WriteLine("OE!!!");
public static class ExpressionExt
public static TExp? CheckForNull<TExp>(this TExp orig, string? message) where TExp : Expression => (TExp?)(new NullTestVisitor(message).Visit(orig));
public class NullTestVisitor : ExpressionVisitor
private readonly string? _message;
public NullTestVisitor(string? message)
public override Expression? Visit(Expression? node)
if (node is MemberExpression nme)
return Expression.Condition(
Expression.MakeBinary(ExpressionType.Equal, nme.Expression.CheckForNull(_message), Expression.Constant(null, nme.Expression.Type)),
Expression.Throw(Expression.Constant(new ArgumentNullException(_message ?? $"{nme.Member.Name} is null.")), nme.Type),