private static PropertyInfo?GetBasePropertyDefinition(RuntimePropertyInfo property) { MethodInfo?method = property.GetGetMethod(true); if (method == null || !method.IsVirtual) { method = property.GetSetMethod(true); } if (method == null || !method.IsVirtual) { return(null); } MethodInfo baseMethod = ((RuntimeMethodInfo)method).GetBaseMethod(); if (baseMethod != null && baseMethod != method) { ParameterInfo[] parameters = property.GetIndexParameters(); if (parameters != null && parameters.Length > 0) { Type[] paramTypes = new Type[parameters.Length]; for (int i = 0; i < paramTypes.Length; i++) { paramTypes[i] = parameters[i].ParameterType; } return(baseMethod.DeclaringType !.GetProperty(property.Name, property.PropertyType, paramTypes)); } else { return(baseMethod.DeclaringType !.GetProperty(property.Name, property.PropertyType)); } } return(null); }