@@ -54,23 +54,8 @@ private static bool CanHaveOverridingMethod(this Type derivedType, MethodInfo me
5454 return true ;
5555 }
5656
57- private static int ? GetOverridingMethodIndex ( this MethodInfo methodInfo , MethodInfo [ ] ? allDerivedMethods )
58- {
59- if ( allDerivedMethods is { Length : > 0 } )
60- {
61- var baseDefinition = methodInfo . GetBaseDefinition ( ) ;
62- for ( var i = 0 ; i < allDerivedMethods . Length ; i ++ )
63- {
64- var derivedMethodInfo = allDerivedMethods [ i ] ;
65- if ( derivedMethodInfo . GetBaseDefinition ( ) == baseDefinition )
66- {
67- return i ;
68- }
69- }
70- }
71-
72- return null ;
73- }
57+ private static bool IsOverridingMethodOf ( this MethodInfo methodInfo , MethodInfo baseDefinition )
58+ => methodInfo . GetBaseDefinition ( ) == baseDefinition ;
7459
7560 public static MethodInfo GetOverridingMethod ( this Type derivedType , MethodInfo methodInfo )
7661 {
@@ -81,31 +66,38 @@ public static MethodInfo GetOverridingMethod(this Type derivedType, MethodInfo m
8166
8267 var derivedMethods = derivedType . GetMethods ( BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) ;
8368
84- return methodInfo . GetOverridingMethodIndex ( derivedMethods ) is { } i
85- ? derivedMethods [ i ]
86- // No derived methods were found. Return the original methodInfo
87- : methodInfo ;
69+ MethodInfo ? overridingMethod = null ;
70+ if ( derivedMethods is { Length : > 0 } )
71+ {
72+ var baseDefinition = methodInfo . GetBaseDefinition ( ) ;
73+ overridingMethod = derivedMethods . FirstOrDefault ( derivedMethodInfo
74+ => derivedMethodInfo . IsOverridingMethodOf ( baseDefinition ) ) ;
75+ }
76+
77+ return overridingMethod ?? methodInfo ; // If no derived methods were found, return the original methodInfo
8878 }
8979
9080 public static PropertyInfo GetOverridingProperty ( this Type derivedType , PropertyInfo propertyInfo )
9181 {
92- var accessor = propertyInfo . GetAccessors ( true ) [ 0 ] ;
93-
94- if ( ! derivedType . CanHaveOverridingMethod ( accessor ) )
82+ var accessor = propertyInfo . GetAccessors ( true ) . FirstOrDefault ( derivedType . CanHaveOverridingMethod ) ;
83+ if ( accessor is null )
9584 {
9685 return propertyInfo ;
9786 }
87+
88+ var isGetAccessor = propertyInfo . GetMethod == accessor ;
9889
9990 var derivedProperties = derivedType . GetProperties ( BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) ;
100- var derivedPropertyMethods = derivedProperties
101- . Select ( ( Func < PropertyInfo , MethodInfo ? > )
102- ( propertyInfo . GetMethod == accessor ? p => p . GetMethod : p => p . SetMethod ) )
103- . OfType < MethodInfo > ( ) . ToArray ( ) ;
104-
105- return accessor . GetOverridingMethodIndex ( derivedPropertyMethods ) is { } i
106- ? derivedProperties [ i ]
107- // No derived methods were found. Return the original methodInfo
108- : propertyInfo ;
91+
92+ PropertyInfo ? overridingProperty = null ;
93+ if ( derivedProperties is { Length : > 0 } )
94+ {
95+ var baseDefinition = accessor . GetBaseDefinition ( ) ;
96+ overridingProperty = derivedProperties . FirstOrDefault ( p
97+ => ( isGetAccessor ? p . GetMethod : p . SetMethod ) ? . IsOverridingMethodOf ( baseDefinition ) == true ) ;
98+ }
99+
100+ return overridingProperty ?? propertyInfo ; // If no derived methods were found, return the original methodInfo
109101 }
110102
111103 public static MethodInfo GetImplementingMethod ( this Type derivedType , MethodInfo methodInfo )
0 commit comments