diff --git a/src/YuckQi.Domain.Services/YuckQi.Domain.Services.csproj b/src/YuckQi.Domain.Services/YuckQi.Domain.Services.csproj index 5bc311c..dbe63d3 100644 --- a/src/YuckQi.Domain.Services/YuckQi.Domain.Services.csproj +++ b/src/YuckQi.Domain.Services/YuckQi.Domain.Services.csproj @@ -4,7 +4,7 @@ net6.0 true Kevin J Lambert - 6.4.1 + 6.4.2 LICENSE A .NET library for bootstrapping a domain services project. enable diff --git a/src/YuckQi.Domain.Validation/YuckQi.Domain.Validation.csproj b/src/YuckQi.Domain.Validation/YuckQi.Domain.Validation.csproj index 8ba0233..5435217 100644 --- a/src/YuckQi.Domain.Validation/YuckQi.Domain.Validation.csproj +++ b/src/YuckQi.Domain.Validation/YuckQi.Domain.Validation.csproj @@ -4,7 +4,7 @@ net6.0 true Kevin J Lambert - 6.4.1 + 6.4.2 LICENSE A .NET library providing domain validation fundamentals. enable diff --git a/src/YuckQi.Domain/Extensions/ObjectExtensions.cs b/src/YuckQi.Domain/Extensions/ObjectExtensions.cs index 16a63fd..a639a68 100644 --- a/src/YuckQi.Domain/Extensions/ObjectExtensions.cs +++ b/src/YuckQi.Domain/Extensions/ObjectExtensions.cs @@ -13,7 +13,13 @@ public static class ObjectExtensions public static Dictionary GetDifferencesByProperty(this T a, T b) { var properties = GetObjectProperties(typeof(T)); - var values = properties.Select(t => new KeyValuePair(t, (t.GetValue(a), t.GetValue(b)))); + var values = properties.Select(t => + { + var valueA = a != null ? t.GetValue(a) : null; + var valueB = b != null ? t.GetValue(b) : null; + + return new KeyValuePair(t, (valueA, valueB)); + }); var result = values.Where(t => ! Equals(t.Value.Item1, t.Value.Item2)).ToDictionary(t => t.Key, t => t.Value); return result; @@ -22,7 +28,12 @@ public static class ObjectExtensions public static HashSet GetNonNullProperties(this T a) { var properties = GetObjectProperties(typeof(T)); - var values = properties.Select(t => new KeyValuePair(t, t.GetValue(a))); + var values = properties.Select(t => + { + var valueA = a != null ? t.GetValue(a) : null; + + return new KeyValuePair(t, valueA); + }); var result = values.Where(t => t.Value != null).Select(t => t.Key).ToHashSet(); return result; diff --git a/src/YuckQi.Domain/YuckQi.Domain.csproj b/src/YuckQi.Domain/YuckQi.Domain.csproj index cbad02a..9a09d41 100644 --- a/src/YuckQi.Domain/YuckQi.Domain.csproj +++ b/src/YuckQi.Domain/YuckQi.Domain.csproj @@ -4,7 +4,7 @@ net6.0 true Kevin J Lambert - 6.4.1 + 6.4.2 LICENSE A .NET library for bootstrapping a domain model project. enable diff --git a/test/YuckQi.Domain.UnitTests/Extensions/ObjectExtensionTests.cs b/test/YuckQi.Domain.UnitTests/Extensions/ObjectExtensionTests.cs index 25b0310..17ff7f8 100644 --- a/test/YuckQi.Domain.UnitTests/Extensions/ObjectExtensionTests.cs +++ b/test/YuckQi.Domain.UnitTests/Extensions/ObjectExtensionTests.cs @@ -10,6 +10,25 @@ public class ObjectExtensionTests [SetUp] public void Setup() { } + [Test] + public void Object_WithSomeNonNullProperties_HasExpectedValue() + { + var a = new { a = new Int32?(), b = 1234, c = "hello", d = new Int64?(9999) }; + var result = a.GetNonNullProperties(); + + Assert.That(result, Has.Exactly(3).Items); + Assert.That(result.Select(t => t.Name), Does.Not.Contain("a")); + } + + [Test] + public void Objects_WhereOneIsNull_HaveAllPropertyDifferences() + { + var a = new { a = 123, b = "test" }; + var result = a.GetDifferencesByProperty(default); + + Assert.That(result, Has.Exactly(2).Items); + } + [Test] public void Objects_WithDifferentStringValues_HaveOneDifference() { @@ -22,14 +41,4 @@ public void Objects_WithDifferentStringValues_HaveOneDifference() Assert.That(result.Single().Value.Item1, Is.EqualTo("test")); Assert.That(result.Single().Value.Item2, Is.EqualTo("hello")); } - - [Test] - public void Object_WithSomeNonNullProperties_HasExpectedValue() - { - var a = new { a = new Int32?(), b = 1234, c = "hello", d = new Int64?(9999) }; - var result = a.GetNonNullProperties(); - - Assert.That(result, Has.Exactly(3).Items); - Assert.That(result.Select(t => t.Name), Does.Not.Contain("a")); - } }