Ejemplo n.º 1
0
        /// <summary>
        /// Check if the fields of <typeparamref name="T"/> can be copied.
        /// This method will throw an exception if copy cannot be performed for <typeparamref name="T"/>
        /// Read the exception message for detailed instructions about what is wrong.
        /// Use this to fail fast or in unit tests.
        /// </summary>
        /// <typeparam name="T">The type to get ignore fields for settings for</typeparam>
        /// <param name="referenceHandling">
        /// If Structural is used property values for sub properties are copied for the entire graph.
        /// Activator.CreateInstance is sued to new up references so a default constructor is required, can be private
        /// </param>
        /// <param name="bindingFlags">The binding flags to use when getting fields</param>
        public static void VerifyCanCopyFieldValues <T>(
            ReferenceHandling referenceHandling = ReferenceHandling.Structural,
            BindingFlags bindingFlags           = Constants.DefaultFieldBindingFlags)
        {
            var settings = FieldsSettings.GetOrCreate(referenceHandling, bindingFlags);

            VerifyCanCopyFieldValues <T>(settings);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Compares x and y for equality using field values.
        /// If a type implements IList the items of the list are compared
        /// </summary>
        /// <typeparam name="T">The type to compare</typeparam>
        /// <param name="x">The first instance</param>
        /// <param name="y">The second instance</param>
        /// <param name="referenceHandling">
        /// If Structural is used a deep equals is performed.
        /// Default value is Throw
        /// </param>
        /// <param name="bindingFlags">The binding flags to use when getting properties</param>
        /// <returns>Diff.Empty if <paramref name="x"/> and <paramref name="y"/> are equal</returns>
        public static Diff FieldValues <T>(
            T x,
            T y,
            ReferenceHandling referenceHandling = ReferenceHandling.Structural,
            BindingFlags bindingFlags           = Constants.DefaultFieldBindingFlags)
        {
            var settings = FieldsSettings.GetOrCreate(referenceHandling, bindingFlags);

            return(FieldValues(x, y, settings));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Copies field values from source to target.
        /// Event fields are excluded
        /// </summary>
        /// <typeparam name="T">The type to get ignore fields for settings for</typeparam>
        /// <param name="source">The instance to copy field values from</param>
        /// <param name="target">The instance to copy field values to</param>
        /// <param name="referenceHandling">
        /// If Structural is used field values for sub fields are copied for the entire graph.
        /// Activator.CreateInstance is sued to new up references so a default constructor is required, can be private
        /// </param>
        /// <param name="bindingFlags">The binding flags to use when getting properties</param>
        public static void FieldValues <T>(
            T source,
            T target,
            ReferenceHandling referenceHandling = ReferenceHandling.Structural,
            BindingFlags bindingFlags           = Constants.DefaultFieldBindingFlags)
            where T : class
        {
            var settings = FieldsSettings.GetOrCreate(referenceHandling, bindingFlags);

            FieldValues(source, target, settings);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Create the settings object.
        /// </summary>
        /// <param name="referenceHandling">How references are handled.</param>
        /// <param name="bindingFlags">What bindingflags to use</param>
        /// <returns>An instance of <see cref="FieldsSettings"/></returns>
        public FieldsSettings CreateSettings(
            ReferenceHandling referenceHandling = ReferenceHandling.Structural,
            BindingFlags bindingFlags           = Constants.DefaultFieldBindingFlags)
        {
            if (this.ignoredFields.Count == 0 &&
                this.ignoredTypes == null &&
                this.comparers.Count == 0 &&
                this.copyers.Count == 0)
            {
                return(FieldsSettings.GetOrCreate(referenceHandling, bindingFlags));
            }

            return(new FieldsSettings(
                       this.ignoredFields,
                       this.ignoredTypes,
                       this.immutableTypes,
                       this.comparers,
                       this.copyers,
                       referenceHandling,
                       bindingFlags));
        }