1
1
using System ;
2
2
using System . Reflection ;
3
+ using System . Runtime . Serialization ;
3
4
4
5
namespace Python . Runtime
5
6
{
@@ -8,17 +9,25 @@ namespace Python.Runtime
8
9
/// Implements a Python descriptor type that manages CLR properties.
9
10
/// </summary>
10
11
[ Serializable ]
11
- internal class PropertyObject : ExtensionType
12
+ internal class PropertyObject : ExtensionType , IDeserializationCallback
12
13
{
13
14
internal MaybeMemberInfo < PropertyInfo > info ;
14
- private MaybeMethodInfo getter ;
15
- private MaybeMethodInfo setter ;
15
+ [ NonSerialized ]
16
+ private MethodInfo ? getter ;
17
+ [ NonSerialized ]
18
+ private MethodInfo ? setter ;
16
19
17
20
public PropertyObject ( PropertyInfo md )
18
21
{
19
- getter = md . GetGetMethod ( true ) ;
20
- setter = md . GetSetMethod ( true ) ;
21
22
info = new MaybeMemberInfo < PropertyInfo > ( md ) ;
23
+ CacheAccessors ( ) ;
24
+ }
25
+
26
+ void CacheAccessors ( )
27
+ {
28
+ PropertyInfo md = info . Value ;
29
+ getter = md . GetGetMethod ( true ) ?? md . GetBaseGetMethod ( true ) ;
30
+ setter = md . GetSetMethod ( true ) ?? md . GetBaseSetMethod ( true ) ;
22
31
}
23
32
24
33
@@ -35,7 +44,7 @@ public static NewReference tp_descr_get(BorrowedReference ds, BorrowedReference
35
44
return Exceptions . RaiseTypeError ( self . info . DeletedMessage ) ;
36
45
}
37
46
var info = self . info . Value ;
38
- MethodInfo getter = self . getter . UnsafeValue ;
47
+ MethodInfo ? getter = self . getter ;
39
48
object result ;
40
49
41
50
@@ -70,7 +79,7 @@ public static NewReference tp_descr_get(BorrowedReference ds, BorrowedReference
70
79
71
80
try
72
81
{
73
- result = info . GetValue ( co . inst , null ) ;
82
+ result = getter . Invoke ( co . inst , Array . Empty < object > ( ) ) ;
74
83
return Converter . ToPython ( result , info . PropertyType ) ;
75
84
}
76
85
catch ( Exception e )
@@ -100,7 +109,7 @@ public static int tp_descr_set(BorrowedReference ds, BorrowedReference ob, Borro
100
109
}
101
110
var info = self . info . Value ;
102
111
103
- MethodInfo setter = self . setter . UnsafeValue ;
112
+ MethodInfo ? setter = self . setter ;
104
113
105
114
if ( val == null )
106
115
{
@@ -141,7 +150,7 @@ public static int tp_descr_set(BorrowedReference ds, BorrowedReference ob, Borro
141
150
Exceptions . RaiseTypeError ( "invalid target" ) ;
142
151
return - 1 ;
143
152
}
144
- info . SetValue ( co . inst , newval , null ) ;
153
+ setter . Invoke ( co . inst , new object ? [ ] { newval } ) ;
145
154
}
146
155
else
147
156
{
@@ -169,5 +178,13 @@ public static NewReference tp_repr(BorrowedReference ob)
169
178
var self = ( PropertyObject ) GetManagedObject ( ob ) ! ;
170
179
return Runtime . PyString_FromString ( $ "<property '{ self . info } '>") ;
171
180
}
181
+
182
+ void IDeserializationCallback . OnDeserialization ( object sender )
183
+ {
184
+ if ( info . Valid )
185
+ {
186
+ CacheAccessors ( ) ;
187
+ }
188
+ }
172
189
}
173
190
}
0 commit comments