@@ -206,15 +206,19 @@ private class StandardResolver : MemberResolver {
206206 MemberGroup res ;
207207
208208 foreach ( Type curType in binder . GetContributingTypes ( type ) ) {
209- res = FilterObjectMembers ( FilterSpecialNames ( binder . GetMember ( curType , name ) , name , action ) ) ;
209+ res = binder . GetMember ( curType , name ) ;
210+ res = FilterSpecialNames ( res , name , action ) ;
211+ res = FilterProperties ( res , action ) ;
212+ res = FilterObjectMembers ( res ) ;
210213 if ( res . Count > 0 ) {
211214 return res ;
212215 }
213216 }
214217
215218 if ( type . IsInterface ) {
216219 foreach ( Type t in type . GetInterfaces ( ) ) {
217- res = FilterSpecialNames ( binder . GetMember ( t , name ) , name , action ) ;
220+ res = binder . GetMember ( t , name ) ;
221+ res = FilterSpecialNames ( res , name , action ) ;
218222 if ( res . Count > 0 ) {
219223 return res ;
220224 }
@@ -265,7 +269,8 @@ private class ObjectResolver : StandardResolver {
265269 continue ;
266270 }
267271
268- res = FilterSpecialNames ( binder . GetMember ( curType , name ) , name , action ) ;
272+ res = binder . GetMember ( curType , name ) ;
273+ res = FilterSpecialNames ( res , name , action ) ;
269274 if ( res . Count > 0 ) {
270275 return res ;
271276 }
@@ -1869,21 +1874,68 @@ private static void EnsureOperatorTable() {
18691874 }
18701875 }
18711876
1877+ #nullable enable
1878+
1879+ private static MemberGroup FilterProperties ( MemberGroup group , MemberRequestKind action ) {
1880+ List < MemberTracker > ? mts = null ;
1881+ for ( int i = 0 ; i < group . Count ; i ++ ) {
1882+ MemberTracker mt = group [ i ] ;
1883+
1884+ if ( mt . MemberType == TrackerTypes . Property && mt is ReflectedPropertyTracker rpt ) {
1885+ if ( FilterProperty ( action , rpt . Property ) ) {
1886+ mts ??= MakeListWithPreviousMembers ( group , mts , i ) ;
1887+ continue ;
1888+ }
1889+ }
1890+ mts ? . Add ( mt ) ;
1891+ }
1892+
1893+ if ( mts != null ) {
1894+ if ( mts . Count == 0 ) {
1895+ return MemberGroup . EmptyGroup ;
1896+ }
1897+ return new MemberGroup ( mts . ToArray ( ) ) ;
1898+ }
1899+ return group ;
1900+
1901+ static bool FilterProperty ( MemberRequestKind action , PropertyInfo property ) {
1902+ if ( action == MemberRequestKind . Get ) {
1903+ if ( property . GetMethod is null && property . SetMethod is not null ) {
1904+ return property . SetMethod != property . SetMethod . GetBaseDefinition ( ) ;
1905+ }
1906+ } else if ( action == MemberRequestKind . Set ) {
1907+ if ( property . SetMethod is null && property . GetMethod is not null ) {
1908+ return property . GetMethod != property . GetMethod . GetBaseDefinition ( ) ;
1909+ }
1910+ }
1911+ return false ;
1912+ }
1913+ }
1914+
18721915 private static MemberGroup /*!*/ FilterObjectMembers ( MemberGroup /*!*/ group ) {
18731916 Assert . NotNull ( group ) ;
1874- List < MemberTracker > mts = new List < MemberTracker > ( ) ;
1917+ List < MemberTracker > ? mts = null ;
18751918 for ( int i = 0 ; i < group . Count ; i ++ ) {
18761919 MemberTracker mt = group [ i ] ;
18771920
18781921 if ( mt . DeclaringType == typeof ( object ) || mt . DeclaringType == typeof ( ObjectOps ) ) {
1879- continue ;
1922+ mts ??= MakeListWithPreviousMembers ( group , mts , i ) ;
1923+ continue ;
18801924 }
1881- mts . Add ( mt ) ;
1925+ mts ? . Add ( mt ) ;
18821926 }
1883- if ( mts . Count == 0 ) return MemberGroup . EmptyGroup ;
1884- return new MemberGroup ( mts . ToArray ( ) ) ;
1927+
1928+ if ( mts != null ) {
1929+ if ( mts . Count == 0 ) {
1930+ return MemberGroup . EmptyGroup ;
1931+ }
1932+ return new MemberGroup ( mts . ToArray ( ) ) ;
1933+ }
1934+ return group ;
18851935 }
18861936
1937+ #nullable restore
1938+
18871939 private static MemberGroup /*!*/ FilterSpecialNames ( MemberGroup /*!*/ group , string /*!*/ name , MemberRequestKind /*!*/ action ) {
18881940 Assert . NotNull ( group , name , action ) ;
18891941
0 commit comments