diff --git a/src/RealmJson.Extensions/Extension.cs b/src/RealmJson.Extensions/Extension.cs index 7968d3b..7f87abc 100644 --- a/src/RealmJson.Extensions/Extension.cs +++ b/src/RealmJson.Extensions/Extension.cs @@ -29,7 +29,7 @@ public static class RealmDoesJson /// /// Realm Instance /// Json string - /// bool. + /// bool. /// RealmOject-based Class.. public static T CreateObjectFromJson(this Realm realm, string jsonString, bool inTransaction = false) where T : RealmObject { @@ -225,7 +225,7 @@ static void CreateUpdateRecordsViaAutoMapper(Realm realm, PropertyInfo pkProp // }); [MethodImpl(MethodImplOptions.AggressiveInlining)] - static T CreateObject(Realm realm, T realmObject, bool updateRecord, bool inTransaction ) where T : RealmObject + static T CreateObject(Realm realm, T realmObject, bool updateRecord, bool inTransaction) where T : RealmObject { if (inTransaction) { @@ -278,6 +278,33 @@ static RealmObject FindByPKDynamic(Realm realm, Type type, object primaryKeyValu return realm.Find(type.Name, (string)primaryKeyValue); } + public static T NonManagedCopy(this RealmObject realmObject) where T : RealmObject + { + var newRecordConfiguration = new MapperConfiguration(cfg => + { + cfg.CreateMap(); + }); + var newMapper = newRecordConfiguration.CreateMapper(); + + var realmObjectCopy = (T)Activator.CreateInstance(typeof(T)); + newMapper.Map(realmObject, realmObjectCopy); + return realmObjectCopy; + } + + public static RealmObject NonManagedCopy(this RealmObject realmObject) + { + var objectType = realmObject.GetType(); + var newRecordConfiguration = new MapperConfiguration(cfg => + { + cfg.CreateMap(objectType, objectType); + }); + var newMapper = newRecordConfiguration.CreateMapper(); + + var realmObjectCopy = Activator.CreateInstance(objectType) as RealmObject; + newMapper.Map(realmObject, realmObjectCopy); + return realmObjectCopy; + } + //void createOrUpdateAllFromJson(Class clazz, InputStream in) //Tries to update a list of existing objects identified by their primary key with new JSON data. // diff --git a/src/RealmJson.Extensions/SushiHangover.RealmJson.csproj b/src/RealmJson.Extensions/SushiHangover.RealmJson.csproj index c803247..4839e5e 100644 --- a/src/RealmJson.Extensions/SushiHangover.RealmJson.csproj +++ b/src/RealmJson.Extensions/SushiHangover.RealmJson.csproj @@ -51,18 +51,18 @@ ..\packages\AutoMapper.5.1.1\lib\portable-net45+win8+wpa81\AutoMapper.dll - - ..\packages\Newtonsoft.Json.9.0.2-beta1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll - - - ..\packages\DotNetCross.Memory.Unsafe.0.2.2\lib\DotNetCross.Memory.Unsafe.dll - ..\packages\Remotion.Linq.2.1.1\lib\portable-net45+win+wpa81+wp80\Remotion.Linq.dll ..\packages\Realm.Database.1.0.3\lib\portable-net45+sl5+wp8+wpa81+win8+monoandroid+Xamarin.iOS10+monotouch+Xamarin.Mac\Realm.dll + + ..\packages\Newtonsoft.Json.9.0.2-beta2\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll + + + ..\packages\DotNetCross.Memory.Unsafe.0.2.3.4\lib\netstandard1.0\DotNetCross.Memory.Unsafe.dll + diff --git a/src/RealmJson.Extensions/packages.config b/src/RealmJson.Extensions/packages.config index 9421e9a..589c24b 100644 --- a/src/RealmJson.Extensions/packages.config +++ b/src/RealmJson.Extensions/packages.config @@ -1,9 +1,9 @@  - + - + diff --git a/src/RealmJson.Shared.Tests/Tests.Shared.cs b/src/RealmJson.Shared.Tests/Tests.Shared.cs index 6901c40..f945185 100644 --- a/src/RealmJson.Shared.Tests/Tests.Shared.cs +++ b/src/RealmJson.Shared.Tests/Tests.Shared.cs @@ -269,6 +269,86 @@ public void CreateAllFromJson_InvalidStream() } } + [Test] + public void NonManagedCopyFromNonManagedGenericType() + { + var obj1 = new State + { + name = "ZZ", + abbreviation = "Z" + }; + var obj2 = obj1.NonManagedCopy(); + Assert.False(obj2.IsManaged); + // Non-managed objects are never equivalate, this RealmObject.Equals can not be used + Assert.AreEqual(obj1.abbreviation, obj2.abbreviation); + Assert.AreEqual(obj1.name, obj2.name); + } + + [Test] + public void NonManagedCopyFromNonManagedRealmObjectType() + { + var obj1 = new State + { + name = "ZZ", + abbreviation = "Z" + }; + var obj2 = obj1.NonManagedCopy(); + var obj3 = obj2 as State; + // Non-managed objects are never equivalate, this RealmObject.Equals can not be used + Assert.False(obj3.IsManaged); + Assert.AreEqual(obj1.abbreviation, obj3.abbreviation); + Assert.AreEqual(obj1.name, obj3.name); + } + + [Test] + public void NonManagedCopyFromManagedGenericType() + { + using (var theRealm = Realm.GetInstance(RealmDBTempPath())) + { + State obj1 = null; + theRealm.Write(() => + { + var tmp = new State + { + name = "ZZ", + abbreviation = "Z" + }; + obj1 = theRealm.Add(tmp); + }); + Assert.True(obj1.IsManaged); + var obj2 = obj1.NonManagedCopy(); + // Non-managed objects are never equivalate, this RealmObject.Equals can not be used + Assert.False(obj2.IsManaged); + Assert.AreEqual(obj1.abbreviation, obj2.abbreviation); + Assert.AreEqual(obj1.name, obj2.name); + } + } + + [Test] + public void NonManagedCopyFromManagedRealmObjectType() + { + using (var theRealm = Realm.GetInstance(RealmDBTempPath())) + { + State obj1 = null; + theRealm.Write(() => + { + var tmp = new State + { + name = "ZZ", + abbreviation = "Z" + }; + obj1 = theRealm.Add(tmp); + }); + Assert.True(obj1.IsManaged); + var obj2 = obj1.NonManagedCopy() as State; + // Non-managed objects are never equivalate, this RealmObject.Equals can not be used + Assert.False(obj2.IsManaged); + Assert.AreEqual(obj1.abbreviation, obj2.abbreviation); + Assert.AreEqual(obj1.name, obj2.name); + } + } + + #endif } diff --git a/src/RealmJson.Test.Droid/packages.config b/src/RealmJson.Test.Droid/packages.config index 1641024..4672998 100644 --- a/src/RealmJson.Test.Droid/packages.config +++ b/src/RealmJson.Test.Droid/packages.config @@ -3,30 +3,30 @@ - + - + - + - - - - - + + + + + - + diff --git a/src/RealmJson.Test.iOS/RealmJson.Test.iOS.csproj b/src/RealmJson.Test.iOS/RealmJson.Test.iOS.csproj index 0d1951a..2d841d1 100644 --- a/src/RealmJson.Test.iOS/RealmJson.Test.iOS.csproj +++ b/src/RealmJson.Test.iOS/RealmJson.Test.iOS.csproj @@ -96,9 +96,6 @@ ..\packages\AutoMapper.5.1.1\lib\netstandard1.3\AutoMapper.dll - - ..\packages\DotNetCross.Memory.Unsafe.0.2.2\lib\dotnet\DotNetCross.Memory.Unsafe.dll - ..\packages\Remotion.Linq.2.1.1\lib\portable-net45+win+wpa81+wp80\Remotion.Linq.dll @@ -109,6 +106,9 @@ ..\packages\Newtonsoft.Json.9.0.2-beta2\lib\netstandard1.1\Newtonsoft.Json.dll + + ..\packages\DotNetCross.Memory.Unsafe.0.2.3.4\lib\netstandard1.0\DotNetCross.Memory.Unsafe.dll + diff --git a/src/RealmJson.Test.iOS/packages.config b/src/RealmJson.Test.iOS/packages.config index 1ef74e5..1e2d69c 100644 --- a/src/RealmJson.Test.iOS/packages.config +++ b/src/RealmJson.Test.iOS/packages.config @@ -1,7 +1,7 @@  - + @@ -23,7 +23,7 @@ - +