// Ordinary public class SimpleDto : ValueObject { public string Value { get; set; } } // With base class public abstract class BaseDto : ValueObject { public string BaseValue { get; set; } } public class DtoWithBase : BaseDto { public string Value { get; set; } } public class Program { static void Main() { var s1 = new SimpleDto { Value = "Sample" }; var s2 = new SimpleDto { Value = "Sample" }; var s3 = new SimpleDto { Value = "Sample2" }; var e1 = s1 == s2; // true var e2 = s1 == s3; // false var d1 = new DtoWithBase { Value = "Sample", BaseValue = "Sample" }; var d2 = new DtoWithBase { Value = "Sample", BaseValue = "Sample" }; var d3 = new DtoWithBase { Value = "Sample", BaseValue = "Sample2" }; var e3 = d1 == d2; // true var e4 = d1 == d3; // false } }