Как переопределить свойство getter-only с помощью сеттера в C#?

обновление: этот вопрос был пересмотрен, чтобы сделать его более ясным. Ответы ниже, похоже, отражают, что этот метод работает хорошо. Надеюсь, этот вопрос может помочь людям, которым нужно добавить get или set к существующему имуществу.


столкнулся с проблемой сегодня, когда мне нужно переопределить базовый класс get-только свойство с get и set. Текущий консенсус, кажется, что это невозможно, но я думаю, я нашел способ.

общая идея-сделать new свойство вместо непосредственно overrideing старый, затем мы создаем метод моста, который overrides старый get метод с вызовом нового.

ситуация

вот некоторый код для произвольной ранее существующей структуры типов, которую нельзя изменить.

public abstract class A
{
    public abstract int X { get; }
}
public class B : A
{
    public override int X { get { return 0; } }
}

3 ответов


будьте осторожны с вашим решением, поскольку оно скрывает исходное намерение для A и B. При этом ваше решение работает, даже при приведении к базовым классам.

пример:

        D d = new D();
        d.X = 2;
        B b = d as B;

        Assert.AreEqual(2, b.X);

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


обновление: Следующее неправильно.

нет.

public abstract class A
{
    public abstract int X { get; }

    public int GetXPlusOne()
    {
        return X + 1;
    }
}

вы не измените значение A.X.

var d = new D();
d.X = 10;

d.GetXPlusOne() == 1

введя новое свойство XGetter в вашем примере, вы сделали решение более сложным, чем оно должно быть. Вы можете ввести одно и то же свойство и просто отменить, какое свойство получает геттер и сеттер.

public abstract class A
{
    public abstract int X { get; }
}
public class D : A
{
    private int _x;
    public sealed override int X { get { return XGetterSetter; } }
    public virtual int XGetterSetter { get { return this._x; } set { this._x = value; } }
}

в приведенном выше примере в классе D столько же кода, сколько и в исходном примере. Это просто устраняет необходимость в классе B и классе C из вашего примера.

семантически это решение может быть другим. Тебе придется установите свойство XGetterSetter в отличие от свойства X. Производные классы D также должны были бы переопределить XGetterSetter в отличие от X.