Если класс объекта, который вы передаете, был написан вами, то вам повезло.
Задайте себе вопрос: если бы в C # была функция const
, какие операции с объектом я бы ожидал запретить через ссылку const
на мой класс?
Затем определите interface
, который исключает запрещенные операции.
Например:
class MyClass
{
public string GetSomething() { ... }
public void Clobber() { ... }
public int Thing { get { ... } set { ... } }
}
Соответствующий интерфейс "const" может быть:
interface IConstMyClass
{
public string GetSomething() { ... }
public int Thing { get { ... } }
}
Теперь измените класс:
class MyClass : IConstMyClass
{
Теперь вы можете использовать IConstMyClass
для обозначения const MyClass
.
void MyMethod(int x, int y, IConstMyClass obj)
Примечание: будут те, кто скажет вам, что этого недостаточно. Что если MyMethod
возвращается к MyClass
? Но игнорируйте их. В конечном счете, разработчик может использовать отражение, чтобы обойти любой аспект системы типов - посмотрите этот забавный пример .
Единственный способ остановить атаки отражением - тривиальный подход: создать полностью отключенного клона.