Это должно сделать:
public static bool IsAutoProperty(this PropertyInfo prop)
{
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
Причина в том, что для авто-свойств свойство Name
основы FieldInfo
будет выглядеть так:
<PropertName>k__BackingField
Поскольку символы <
и >
не будут отображаться для обычных полей, поле с такими именами указывает на вспомогательное поле автоматического свойства. Как говорит Джейсон, она еще хрупкая.
Или сделать это немного быстрее,
public static bool IsAutoProperty(this PropertyInfo prop)
{
if (!prop.CanWrite || !prop.CanRead)
return false;
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}