Как правильно настроить C# методы, чтобы при работе с ними из свойств в другом классе нельзя было обойти get свойство через внутренние методы и ссылки

Основной класс, с какой-то логикой:

class A
{
    private int i = 0;
    public int I
    { 
        get => i;
        set => i = value;
    }
    public int GetI()
    {
        return i;
    }
    public void SetI(int I)
    {
        this.I = I;
    }
}

Класс, где нужно чтобы можно было только читать переменную, но не в коем образе ее не изменять, даже через методы встроенные в класс A:

class B
{
    private A aa = new A();
    public A AA
    {
        get => aa;
    }
}

Пример уже работы с классом B:

B b = new B();
Console.WriteLine(b.AA.I);//выведет 0
b.AA.I = 1;
Console.WriteLine(b.AA.I);//выведет 1
b.AA.SetI(2);
Console.WriteLine(b.AA.I);//выведет 2

Собственно, как реализовать в классе A, логику, если он находится в свойстве которое не имеет set свойство, чтобы не работали некоторые функции.


Ответы (1 шт):

Автор решения: aepot

Создать интерфейс

interface IReadOnlyA
{
    int I { get; }
    int GetI();
}

class A : IReadOnlyA
{
    // ...тот же самый код
}

class B
{
    private A aa = new A();
    public IReadOnlyA AA
    {
        get => aa;
    }
}

Получится так

B b = new B();
Console.WriteLine(b.AA.I);
b.AA.I = 1; // CS0200 Property or indexer 'IReadOnlyA.I' cannot be assigned to --it is read only
Console.WriteLine(b.AA.I);
b.AA.SetI(2); // CS1061 'IReadOnlyA' does not contain a definition for 'SetI' and no accessible extension method 'SetI' accepting a first argument of type 'IReadOnlyA' could be found(are you missing a using directive or an assembly reference ?)
Console.WriteLine(b.AA.I);
→ Ссылка