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}