Skip to content

Proxy Creation fails for Non-Virtual readonly properties??? #66

@CorsairRO

Description

@CorsairRO

Hello,

I started to look at your library because it looks exactly what I will need to enable change tracking in my app. My app uses .NET Framework 4.7.2 and is a WPF+SQL Server+EntityFramework app

Now, first I got an error about not all my DataObject properties being virtual.
OK, I made them virtual.

The problem is my ListProperties are ObservableCollection, and not IList
Now I got an error saying property Count is not virtual?
In ObservableCollection => property Count DOES NOT HAVE A SETTER, only a getter.
Not to mention that I cannot edit it to be virtual even if I wanted to, as it belongs to Microsoft.

The error comes when I do trackable.AcceptChanges() and it has a property of type ObservableCollection

Now, my questions would be:

  1. Can I ignore ALL properties defined in the BaseClass of my DataObject and use ONLY properties defined in the DataObject class.
  2. Can I NOT get an exception for a Non-Virtual property? I don't care that it will not participate in the change tracking, I just want to be able to use the library

Related to 1) Is there any way by default to Exclude everything from hierarchy and let me to manually mark things that I want to? Similar to Json.OptIn functionality.

Thank you very much for your help.

FullStackTrace of the error ( cutting out my Main static method from my test console app )
My Object is called wc_package

at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
at ChangeTracking.ComplexPropertyInterceptor1.MakeAllPropertiesTrackable(Object proxy) in C:\projects\changetracking\Source\ChangeTracking\ComplexPropertyInterceptor.cs:line 176 at ChangeTracking.ComplexPropertyInterceptor1.ComplexPropertyTrackables(Object proxy) in C:\projects\changetracking\Source\ChangeTracking\ComplexPropertyInterceptor.cs:line 165
at ChangeTracking.ComplexPropertyInterceptor1.Intercept(IInvocation invocation) in C:\projects\changetracking\Source\ChangeTracking\ComplexPropertyInterceptor.cs:line 144 at Castle.DynamicProxy.AbstractInvocation.Proceed() at ChangeTracking.EditableObjectInterceptor1.Intercept(IInvocation invocation) in C:\projects\changetracking\Source\ChangeTracking\EditableObjectInterceptor.cs:line 87
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at ChangeTracking.ChangeTrackingInterceptor1.Intercept(IInvocation invocation) in C:\projects\changetracking\Source\ChangeTracking\ChangeTrackingInterceptor.cs:line 96 at Castle.DynamicProxy.AbstractInvocation.Proceed() at ChangeTracking.NotifyPropertyChangedInterceptor1.Intercept(IInvocation invocation) in C:\projects\changetracking\Source\ChangeTracking\NotifyPropertyChangedInterceptor.cs:line 68
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.wc_packageProxy.get_ComplexPropertyTrackables()
at ChangeTracking.Internal.Utils.GetChildren[TResult](Object proxy, List1 parents) in C:\projects\changetracking\Source\ChangeTracking\Internal\Utils.cs:line 12 at ChangeTracking.ChangeTrackingInterceptor1.AcceptChanges(Object proxy, List1 parents) in C:\projects\changetracking\Source\ChangeTracking\ChangeTrackingInterceptor.cs:line 300 at ChangeTracking.ChangeTrackingInterceptor1.Intercept(IInvocation invocation) in C:\projects\changetracking\Source\ChangeTracking\ChangeTrackingInterceptor.cs:line 148
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at ChangeTracking.NotifyPropertyChangedInterceptor`1.Intercept(IInvocation invocation) in C:\projects\changetracking\Source\ChangeTracking\NotifyPropertyChangedInterceptor.cs:line 83
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.wc_packageProxy.AcceptChanges()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions