main
 1using System.Reflection;
 2using Gorilla.Commons.Infrastructure.Logging;
 3
 4namespace momoney.database.transactions
 5{
 6    public interface ITrackerEntry<T>
 7    {
 8        T current { get; }
 9        bool has_changes();
10    }
11
12    public class TrackerEntry<T> : ITrackerEntry<T>
13    {
14        readonly T original;
15
16        public TrackerEntry(T original, T current)
17        {
18            this.original = original;
19            this.current = current;
20        }
21
22        public T current { get; set; }
23
24        public bool has_changes()
25        {
26            this.log().debug("checking for changes");
27            var type = original.GetType();
28            foreach (var field in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
29            {
30                var original_value = field.GetValue(original);
31                var current_value = field.GetValue(current);
32                if (original_value == null && current_value != null)
33                {
34                    this.log().debug("{0} has changes: {1}", field, original);
35                    return true;
36                }
37                if (original_value != null && !original_value.Equals(current_value))
38                {
39                    this.log().debug("{0} has changes: {1}", field, original);
40                    return true;
41                }
42            }
43            this.log().debug("has no changes: {0}", original);
44            return false;
45        }
46    }
47}