|
@@ -8,6 +8,7 @@ using System.Linq.Expressions;
|
|
|
using System.Reflection;
|
|
|
using System.Runtime.CompilerServices;
|
|
|
using System.Runtime.Serialization;
|
|
|
+using AutoProperties;
|
|
|
|
|
|
//using PropertyChanged;
|
|
|
|
|
@@ -31,11 +32,45 @@ namespace InABox.Core
|
|
|
/// </summary>
|
|
|
public abstract class BaseObject : INotifyPropertyChanged, IBaseObject
|
|
|
{
|
|
|
+ [GetInterceptor]
|
|
|
+ protected T GetValue<T>(string name, Type propertyType, PropertyInfo propertyInfo, FieldInfo fieldInfo, object fieldValue, T genricFieldValue, ref T refToBackingField)
|
|
|
+ {
|
|
|
+ if (propertyType.IsSubclassOf(typeof(BaseObject)) && !propertyType.IsAbstract && refToBackingField == null)
|
|
|
+ {
|
|
|
+ if (this.GetType().IsAbstract)
|
|
|
+ return refToBackingField;
|
|
|
+ if (propertyType.IsGenericType)
|
|
|
+ return refToBackingField;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ refToBackingField ??= Activator.CreateInstance<T>();
|
|
|
+ if (refToBackingField is ISubObject subObject)
|
|
|
+ {
|
|
|
+ subObject.SetLinkedParent(this);
|
|
|
+ subObject.SetLinkedPath(name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return refToBackingField;
|
|
|
+ }
|
|
|
+
|
|
|
+ [SetInterceptor]
|
|
|
+ protected void SetValue<T>(string name, Type propertyType, PropertyInfo propertyInfo, FieldInfo fieldInfo, object newValue, T genricNewValue, out T refToBackingField)
|
|
|
+ {
|
|
|
+ refToBackingField = genricNewValue;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
public BaseObject()
|
|
|
{
|
|
|
SetObserving(false);
|
|
|
|
|
|
- DatabaseSchema.InitializeSubObjects(this);
|
|
|
+ //DatabaseSchema.InitializeSubObjects(this);
|
|
|
|
|
|
Init();
|
|
|
SetObserving(true);
|
|
@@ -57,11 +92,11 @@ namespace InABox.Core
|
|
|
|
|
|
protected virtual void Init()
|
|
|
{
|
|
|
- CheckOriginalValues();
|
|
|
+ //CheckOriginalValues();
|
|
|
|
|
|
- LoadedColumns = new HashSet<string>();
|
|
|
+ //LoadedColumns = new HashSet<string>();
|
|
|
|
|
|
- UserProperties = new UserProperties();
|
|
|
+ //UserProperties = new UserProperties();
|
|
|
//UserProperties.ParentType = this.GetType();
|
|
|
DatabaseSchema.InitializeObject(this);
|
|
|
UserProperties.OnPropertyChanged += (o, n, b, a) =>
|
|
@@ -110,12 +145,15 @@ namespace InABox.Core
|
|
|
|
|
|
private bool bChanged;
|
|
|
|
|
|
- [DoNotPersist]
|
|
|
- public ConcurrentDictionary<string, object?> OriginalValues { get; set; }
|
|
|
-
|
|
|
- [DoNotPersist]
|
|
|
- [DoNotSerialize]
|
|
|
- public HashSet<string> LoadedColumns { get; set; }
|
|
|
+ private readonly ConcurrentDictionary<string, object?> originalValues = new ConcurrentDictionary<string, object?> ();
|
|
|
+ private readonly HashSet<string> loadedColumns = new HashSet<string>();
|
|
|
+
|
|
|
+ [DoNotPersist]
|
|
|
+ public ConcurrentDictionary<string, object?> OriginalValues => originalValues;
|
|
|
+
|
|
|
+ [DoNotPersist]
|
|
|
+ [DoNotSerialize]
|
|
|
+ public HashSet<string> LoadedColumns => loadedColumns;
|
|
|
|
|
|
protected virtual void SetChanged(string name, object? before, object? after)
|
|
|
{
|
|
@@ -143,7 +181,7 @@ namespace InABox.Core
|
|
|
|
|
|
private bool QueryChanged()
|
|
|
{
|
|
|
- CheckOriginalValues();
|
|
|
+ //CheckOriginalValues();
|
|
|
if (OriginalValues.Count > 0)
|
|
|
return true;
|
|
|
|
|
@@ -173,22 +211,22 @@ namespace InABox.Core
|
|
|
if (!BaseObjectExtensions.HasChanged(before, after))
|
|
|
return;
|
|
|
|
|
|
- CheckOriginalValues();
|
|
|
+ //CheckOriginalValues();
|
|
|
if (!OriginalValues.ContainsKey(name))
|
|
|
OriginalValues[name] = before;
|
|
|
SetChanged(name, before, after);
|
|
|
}
|
|
|
|
|
|
- private void CheckOriginalValues()
|
|
|
- {
|
|
|
- if (OriginalValues == null)
|
|
|
- {
|
|
|
- var bObserving = _observing;
|
|
|
- _observing = false;
|
|
|
- OriginalValues = new ConcurrentDictionary<string, object?>();
|
|
|
- _observing = bObserving;
|
|
|
- }
|
|
|
- }
|
|
|
+ // private void CheckOriginalValues()
|
|
|
+ // {
|
|
|
+ // if (OriginalValues == null)
|
|
|
+ // {
|
|
|
+ // var bObserving = _observing;
|
|
|
+ // _observing = false;
|
|
|
+ // OriginalValues = new ConcurrentDictionary<string, object?>();
|
|
|
+ // _observing = bObserving;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
|
|
|
public bool IsChanged()
|
|
|
{
|
|
@@ -201,7 +239,7 @@ namespace InABox.Core
|
|
|
var bObs = IsObserving();
|
|
|
SetObserving(false);
|
|
|
|
|
|
- CheckOriginalValues();
|
|
|
+ //CheckOriginalValues();
|
|
|
foreach (var key in OriginalValues.Keys.ToArray())
|
|
|
{
|
|
|
try
|
|
@@ -251,7 +289,7 @@ namespace InABox.Core
|
|
|
{
|
|
|
bApplyingChanges = true;
|
|
|
|
|
|
- CheckOriginalValues();
|
|
|
+ //CheckOriginalValues();
|
|
|
OriginalValues.Clear();
|
|
|
|
|
|
bChanged = false;
|
|
@@ -268,7 +306,7 @@ namespace InABox.Core
|
|
|
var type = GetType();
|
|
|
try
|
|
|
{
|
|
|
- CheckOriginalValues();
|
|
|
+ //CheckOriginalValues();
|
|
|
foreach (var key in OriginalValues.Keys)
|
|
|
try
|
|
|
{
|