private void Clone <TParam>(TParam parameters, Func <MemberInfo, bool> customHandler = null) where TParam : IShallowCloneable <TParam> { AssertEx.AllPropertiesAndFieldsAreNotDefault(parameters, i => { if (i.Name == "PageSize" && i.GetValue(parameters).Equals(500)) { Assert.Fail("Property 'PageSize' did not have a value."); } if (customHandler != null) { return(customHandler(i)); } return(false); }); try { AssertEx.AllPropertiesAndFieldsAreEqual(parameters, parameters); } catch (AssertFailedException ex) { throw new AssertFailedException($"Source object was not self equatable: {ex.Message}", ex); } var clone = ((IShallowCloneable <TParam>)parameters).ShallowClone(); AssertEx.AllPropertiesAndFieldsAreEqual(parameters, clone); }