Я думаю, причина в том, что CanWrite говорит, что возвращает true, если есть установщик. Частный сеттер также является сеттером.
Что меня удивляет, так это то, что первые проходы, так как у него есть общедоступный сеттер, так что, если у меня все еще слишком мало кофеина, settercount равен 1, так что утверждение должно провалиться. Они оба должны потерпеть неудачу, поскольку CanWrite просто возвращает true для обоих. (и запрос linq просто извлекает общедоступные свойства, включая идентификатор, поскольку он общедоступен)
(правка) Теперь я вижу, как вы изменили код первого класса, так что у него больше нет установщика.
Итак, вы предполагаете, что CanWrite смотрит на методы доступа метода setter, это не так. Вы должны сделать:
var setterCount =
(from s in typeof (Entity).GetProperties(BindingFlags.Public | BindingFlags.Instance)
where s.GetSetMethod().IsPublic
select s)
.Count();