Ответы предполагают, что объекты, которые получат ссылку на объект в будущем, не будут пытаться изменить его. Если вы хотите защититься от этого, вам нужно, чтобы ваш код с однократной записью работал только для типов, которые реализуют ICloneable или являются примитивами. тип String реализует ICloneable, например. тогда вы вернете клон данных или новый экземпляр примитива вместо фактических данных.
Обобщения только для примитивов:
T GetObject, где T: struct;
Это не нужно, если вы знаете, что объекты, которые получают ссылку на данные, никогда не будут перезаписывать их.
Кроме того, подумайте, будет ли ReadOnlyCollection работать для вашего приложения. исключение выдается при попытке изменения данных.