Browse Source

Fix to BaseObject.GetOriginalValue for nested property

Kenric Nugteren 1 tháng trước cách đây
mục cha
commit
f61de39df3
2 tập tin đã thay đổi với 19 bổ sung19 xóa
  1. 18 18
      InABox.Core/Objects/BaseObject.cs
  2. 1 1
      InABox.Core/Query/Filter.cs

+ 18 - 18
InABox.Core/Objects/BaseObject.cs

@@ -746,51 +746,51 @@ namespace InABox.Core
 
         public static bool HasOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property) where T : BaseObject
         {
-            //var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
-            String propname = CoreUtils.GetFullPropertyName(property, ".");
+            var propname = CoreUtils.GetFullPropertyName(property, ".");
             return !String.IsNullOrWhiteSpace(propname) && sender.OriginalValueList != null && sender.OriginalValueList.ContainsKey(propname);
         }
 
-        public static bool TryGetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property, [NotNullWhen(true)] out TType value) where T : BaseObject
+        public static bool TryGetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property, TType defaultValue, [NotNullWhen(true)] out TType value) where T : BaseObject
         {
-            var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
-            if(prop is null || sender.OriginalValueList is null)
+            var propname = CoreUtils.GetFullPropertyName(property, ".");
+            if(propname.IsNullOrWhiteSpace() || sender.OriginalValueList is null)
             {
-                value = default;
+                value = defaultValue;
                 return false;
             }
-            else if(sender.OriginalValueList.TryGetValue(prop.Name, out var val))
+            else if(sender.OriginalValueList.TryGetValue(propname, out var val))
             {
                 value = CoreUtils.ChangeType<TType>(val);
                 return true;
             }
             else
             {
-                value = default;
+                value = defaultValue;
                 return false;
             }
         }
 
+        public static bool TryGetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property, [NotNullWhen(true)] out TType value) where T : BaseObject
+        {
+            return sender.TryGetOriginalValue(property, default, out value);
+        }
+
         public static TType GetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property) where T : BaseObject
         {
-            var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
-            return prop != null && sender.OriginalValueList != null && sender.OriginalValueList.TryGetValue(prop.Name, out var value)
-                ? (TType)CoreUtils.ChangeType(value, typeof(TType))
-                : default;
+            sender.TryGetOriginalValue(property, out var value);
+            return value;
         }
         
         public static TType GetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property, TType defaultValue) where T : BaseObject
         {
-            var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
-            return prop != null && sender.OriginalValueList != null && sender.OriginalValueList.TryGetValue(prop.Name, out var value)
-                ? (TType)CoreUtils.ChangeType(value, typeof(TType))
-                : defaultValue;
+            sender.TryGetOriginalValue(property, defaultValue, out var value);
+            return value;
         }
 
         public static void SetOriginalValue<T, TType>(this T sender, Expression<Func<T, TType>> property, TType value) where T : BaseObject
         {
-            var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
-            sender.OriginalValueList[prop.Name] = value;
+            var propname = CoreUtils.GetFullPropertyName(property, ".");
+            sender.OriginalValueList[propname] = value;
         }
     }
 

+ 1 - 1
InABox.Core/Query/Filter.cs

@@ -815,7 +815,7 @@ namespace InABox.Core
             return And(CoreUtils.GetFullPropertyName(expression, "."));
         }
 
-        public Filter<T> And(IFilter filter)
+        private Filter<T> And(IFilter filter)
         {
             if (filter is Filter<T> filterT)
                 return And(filterT);