public void SetAttribute(string name, object value) { if (value == default) { if (_attributes.Remove(name)) { Dirty = true; } return; } if (_attributes.TryGetValue(name, out object existing)) { try { if (ComparisonHelper.IsSameValue(existing, value)) { return; } } catch (Exception e) { throw new InvalidOperationException($"Unable to compare values for '{PublishTopic}'", e); } return; } _attributes[name] = value; Dirty = true; }
public static void SetIfChanged <T>(this JObject obj, string name, T newValue, Action onSet) { if (Equals(newValue, default(T))) { // Remove a value if (obj.Remove(name)) { onSet(); } return; } void Overwrite() { obj[name] = JToken.FromObject(newValue); onSet(); } if (obj.TryGetValue(name, out JToken val) && val != null) { // Compare if (newValue is Array newArray && val is JArray existingArray) { if (newArray.Length != existingArray.Count) { Overwrite(); return; } // Compare each value for (int i = 0; i < newArray.Length; i++) { // TODO: Other types if (!ComparisonHelper.IsSameValue(newArray.GetValue(i), existingArray.Value <string>(i))) { Overwrite(); return; } } // No difference } else { T existing = val.Value <T>(); if (!ComparisonHelper.IsSameValue(existing, newValue)) { Overwrite(); return; } } }
public void SameValueTests() { DateTime dt = new DateTime(2021, 10, 11, 18, 33, 12, DateTimeKind.Utc); DateTime dt2 = new DateTime(2021, 10, 11, 18, 33, 12, DateTimeKind.Utc); Assert.True(ComparisonHelper.IsSameValue(dt, dt2)); DateTime dt3 = new DateTime(2021, 10, 11, 18, 33, 11, DateTimeKind.Utc); Assert.False(ComparisonHelper.IsSameValue(dt, dt3)); Assert.True(ComparisonHelper.IsSameValue(50, 50)); Assert.False(ComparisonHelper.IsSameValue(50, 51)); Assert.True(ComparisonHelper.IsSameValue(1152921504606846976L, 1152921504606846976L)); Assert.False(ComparisonHelper.IsSameValue(1152921504606846977L, 1152921504606846975L)); }
public void SetAttribute(string name, object value) { if (value == default) { if (_attributes.Remove(name)) { Dirty = true; } return; } if (_attributes.TryGetValue(name, out object existing) && ComparisonHelper.IsSameValue(existing, value)) { return; } _attributes[name] = value; Dirty = true; }