Создайте интерфейс для вашего класса, который имеет только методы чтения свойств только для чтения. Тогда пусть ваш параметр относится к этому интерфейсу, а не к самому классу. Пример:
public interface IExample
{
int ReadonlyValue { get; }
}
public class Example : IExample
{
public int Value { get; set; }
public int ReadonlyValue { get { return this.Value; } }
}
public void Foo(IExample example)
{
// Now only has access to the get accessors for the properties
}
Для структур создайте универсальную const-оболочку.
public struct Const<T>
{
public T Value { get; private set; }
public Const(T value)
{
this.Value = value;
}
}
public Foo(Const<float> X, Const<float> Y, Const<float> Z)
{
// Can only read these values
}
Стоит отметить, однако, что странно, что вы хотите делать то, что просите, относительно структур, как автор метода, вы должны знать, что происходит в этом методе. Это не повлияет на передаваемые значения, чтобы изменить их в методе, поэтому ваша единственная задача - убедиться, что вы ведете себя в методе, который вы пишете. Наступает момент, когда бдительность и чистый код являются ключом к соблюдению const и других подобных правил.