Это необходимо для таких сценариев, как удаленное взаимодействие, сериализация, материализация и т. Д. Вы не должны использовать его вслепую, но учтите, что эти средства всегда были доступны в любой системе (по сути, путем обращения к память напрямую). Отражение просто формализует его и помещает элементы управления и проверки таким образом, чего вы не видите, потому что вы, по-видимому, работаете с «полным доверием», поэтому вы уже сильнее, чем защищаемая система.
Если вы попробуете это с частичным доверием, вы увидите гораздо больший контроль над внутренним состоянием.
Это анти-паттерн?
Только если ваш код использует его не по назначению. Например, рассмотрим следующее (действительно для контракта данных WCF):
[DataMember]
private int foo;
public int Foo { get {return foo;} set {foo = value;} }
Неправильно ли WCF поддерживать это? Я подозреваю, что нет ... есть несколько сценариев, в которых вы хотите сериализовать что-то, что не является частью общедоступного API, без отдельного DTO. Аналогично, LINQ-to-SQL материализуется в частные члены, если вы выберете это.