public static PropertyInfo GetBaseDefinition(this PropertyInfo propertyInfo)
{
var method = propertyInfo.GetAccessors(true)[0];
if (method == null)
return null;
var baseMethod = method.GetBaseDefinition();
if (baseMethod == method && baseMethod.DeclaringType == baseMethod.ReflectedType)
return propertyInfo;
var allProperties = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
var arguments = propertyInfo.GetIndexParameters().Select(p => p.ParameterType).ToArray();
return baseMethod.DeclaringType.GetProperty(propertyInfo.Name, allProperties, null, propertyInfo.PropertyType, arguments, null);
}