Jelajahi Sumber

Tweaked BaseObject.CancelChanges to handle nested properties
Updated EntityLink.Synchronise to handle nested links

Frank van den Bos 2 tahun lalu
induk
melakukan
a34ae6cfe9
2 mengubah file dengan 26 tambahan dan 14 penghapusan
  1. 3 1
      InABox.Core/BaseObject.cs
  2. 23 13
      InABox.Core/EntityLink.cs

+ 3 - 1
InABox.Core/BaseObject.cs

@@ -200,7 +200,9 @@ namespace InABox.Core
             {
                 try
                 {
-                    var prop = GetType().GetRuntimeProperty(key);
+                    var prop = key.Contains(".") 
+                        ? CoreUtils.GetProperty(GetType(),key) 
+                        : GetType().GetRuntimeProperty(key);
                     if(prop != null)
                     {
                         if (prop.SetMethod != null)

+ 23 - 13
InABox.Core/EntityLink.cs

@@ -47,27 +47,37 @@ namespace InABox.Core
         public virtual bool Synchronise(object Entity)
         {
             var result = false;
-            var props = CoreUtils.PropertyList(GetType(),
-                x => (!x.Name.Equals("ID") || Entity == null) && !x.DeclaringType.Equals(typeof(BaseObject)), false);
+            var props = CoreUtils.PropertyList(GetType(), x => (!x.Name.Equals("ID") || Entity == null) && !x.DeclaringType.Equals(typeof(BaseObject)), false);
             foreach (var key in props.Keys)
             {
                 if (CoreUtils.HasProperty(Entity.GetType(), key))
                 {
                     var prop = CoreUtils.GetProperty(typeof(T), key);
-                    if (prop != null && prop.PropertyType.Equals(props[key]) && !prop.PropertyType.GetInterfaces().Any(x => x == typeof(IEntityLink)))
+                    if (prop != null && prop.PropertyType.Equals(props[key]))
+                        
                     {
-                        var oldvalue = CoreUtils.GetPropertyValue(this, key);
-                        var newvalue = CoreUtils.GetPropertyValue(Entity, key);
-                        if ((oldvalue == null && newvalue != null) || (oldvalue != null && !oldvalue.Equals(newvalue)))
+                        if (prop.PropertyType.GetInterfaces().Any(x => x == typeof(IEntityLink)))
                         {
-                            result = true;
-                            try
-                            {
-                                CoreUtils.SetPropertyValue(this, key, newvalue);
-                            }
-                            catch (Exception e)
+                            var tgtlink = CoreUtils.GetPropertyValue(this, key) as IEntityLink;
+                            var srclink = CoreUtils.GetPropertyValue(Entity, key) as IEntityLink;
+                            tgtlink.ID = srclink.ID;
+                            tgtlink.Synchronise(srclink);
+                        }
+                        else
+                        {
+                            var oldvalue = CoreUtils.GetPropertyValue(this, key);
+                            var newvalue = CoreUtils.GetPropertyValue(Entity, key);
+                            if ((oldvalue == null && newvalue != null) || (oldvalue != null && !oldvalue.Equals(newvalue)))
                             {
-                                Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
+                                result = true;
+                                try
+                                {
+                                    CoreUtils.SetPropertyValue(this, key, newvalue);
+                                }
+                                catch (Exception e)
+                                {
+                                    Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
+                                }
                             }
                         }
                     }