소스 검색

Added BaseObject.TryGetOriginalValue

Kenric Nugteren 1 개월 전
부모
커밋
51c7e2bb78
1개의 변경된 파일25개의 추가작업 그리고 4개의 파일을 삭제
  1. 25 4
      InABox.Core/Objects/BaseObject.cs

+ 25 - 4
InABox.Core/Objects/BaseObject.cs

@@ -4,6 +4,7 @@ using System.Collections;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Reflection;
@@ -750,19 +751,39 @@ namespace InABox.Core
             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
+        {
+            var prop = ((MemberExpression)property.Body).Member as PropertyInfo;
+            if(prop is null || sender.OriginalValueList is null)
+            {
+                value = default;
+                return false;
+            }
+            else if(sender.OriginalValueList.TryGetValue(prop.Name, out var val))
+            {
+                value = CoreUtils.ChangeType<TType>(val);
+                return true;
+            }
+            else
+            {
+                value = default;
+                return false;
+            }
+        }
+
         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.ContainsKey(prop.Name)
-                ? (TType)CoreUtils.ChangeType(sender.OriginalValueList[prop.Name], typeof(TType))
+            return prop != null && sender.OriginalValueList != null && sender.OriginalValueList.TryGetValue(prop.Name, out var value)
+                ? (TType)CoreUtils.ChangeType(value, typeof(TType))
                 : default;
         }
         
         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.ContainsKey(prop.Name)
-                ? (TType)CoreUtils.ChangeType(sender.OriginalValueList[prop.Name], typeof(TType))
+            return prop != null && sender.OriginalValueList != null && sender.OriginalValueList.TryGetValue(prop.Name, out var value)
+                ? (TType)CoreUtils.ChangeType(value, typeof(TType))
                 : defaultValue;
         }