Вы также можете проверить, что IsSpecialName имеет значение true. это будет верно для свойства (среди прочего)
На уровне il методы представлены следующим образом (на примере Environment.ExitCode):
.method public hidebysig specialname static int32 get_ExitCode() cil managed
.method public hidebysig specialname static void set_ExitCode(int32 'value') cil managed
Если вы хотите получить фантазию, вы можете проверить после извлечения названия, что указанное свойство существует, но, если честно,
if (m.IsSpecialName && (m.Attributes & MethodAttributes.HideBySig) != 0))
, а также начинается с get_ или set_, тогда вы должны быть хороши даже для людей, использующих противные имена (подделать hidebysig достаточно просто, подделать IsSpecialName будет очень сложно)
Ничто не гарантировано, хотя. Кто-то может создать класс с помощью метода set_Foo, который выглядит как метод реального набора, но на самом деле не является набором для свойства только для чтения.
Если вы не проверите, является ли свойство CanRead / CanWrite также.
Это кажется мне безумием, хотя вы не ожидаете преднамеренного обхода.
Простой метод утилиты / расширения в MethodInfo, который использовал эту логику, не был бы слишком сложным, и включение IsSpecialName почти наверняка охватило бы все ваши потребности.