Существует ImmutableObjectAttribute
, но это редко используется и плохо поддерживается - и, конечно, не применяется (вы можете пометить изменяемый объект с помощью [ImmutableObject(true)]
. AFAIK, единственное, на что это влияет, это то, как IDE обрабатывает атрибуты (т.е. показывать / не показывать параметры именованных свойств).
В действительности вам нужно будет проверить FieldInfo.IsInitOnly
, но это относится только к действительно 100% неизменяемым типам (при условии отсутствия злоупотребления отражением и т. Д.); это не помогает с неизменностью эскимо или вещами, которые неизменны на практике, но не в их реализации; то есть их нельзя сделать публично изменяемыми, но теоретически объект поддерживает это.
Классическим примером здесь будет строка ... все "знают", что string
является неизменным ... конечно, StringBuilder
действительно изменяет строку под капотом. Нет, серьезно ...
С учетом этого так трудно определить неизменность, не говоря уже о том, чтобы надежно его обнаружить ...