using System.Linq.Expressions;
public static void Main()
var inst = new MyType { MyInt1 = 1 };
inst.NoValueTypedPropertyHasDefaultValue(x => x.MyInt2);
public int MyInt1 { get; set; }
public int MyInt2 { get; set; }
public int MyInt3 { get; set; }
public static class Extensions
public static void NoValueTypedPropertyHasDefaultValue<T>(this T t, params Expression<Func<T,object>>[] propertiesToIgnore)
var propertyNamesToIgnore = propertiesToIgnore.Select(x => GetMemberInfo(x).Member.Name).ToArray();
foreach (var property in typeof(T).GetProperties())
var propertyType = property.PropertyType;
if (propertyType.IsValueType && !propertyNamesToIgnore.Contains(property.Name))
var defaultValue = Activator.CreateInstance(propertyType);
object actualValue = property.GetValue(t);
if (defaultValue.Equals(actualValue)) throw new Exception($"Assert fail: {property.Name}");
private static MemberExpression GetMemberInfo(Expression method)
LambdaExpression lambda = method as LambdaExpression;
throw new ArgumentNullException("method");
MemberExpression memberExpr = null;
if (lambda.Body.NodeType == ExpressionType.Convert)
((UnaryExpression)lambda.Body).Operand as MemberExpression;
else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
memberExpr = lambda.Body as MemberExpression;
throw new ArgumentException("method");