Как переопределить свойство getter-only с помощью сеттера в C#?
обновление: этот вопрос был пересмотрен, чтобы сделать его более ясным. Ответы ниже, похоже, отражают, что этот метод работает хорошо. Надеюсь, этот вопрос может помочь людям, которым нужно добавить get
или set
к существующему имуществу.
столкнулся с проблемой сегодня, когда мне нужно переопределить базовый класс get
-только свойство с get
и set
. Текущий консенсус, кажется, что это невозможно, но я думаю, я нашел способ.
общая идея-сделать new
свойство вместо непосредственно override
ing старый, затем мы создаем метод моста, который override
s старый 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.