如何使用C#中的setter覆盖getter-only属性?

Nat*_*Nat 7 c# getter setter overriding readonly

更新: 此问题已经过修改,以使其更加清晰.下面的答案似乎反映出这种方法效果很好.希望这个问题可以帮助那些需要添加get或者添加set现有财产的人.


今天遇到一个问题,我需要get用a get和覆盖基类的-only属性set.目前的共识似乎是这是不可能的,但我认为我找到了一种方法.

一般的想法是创建一个new属性而不是直接override使用旧属性,然后我们通过调用新方法创建一个overrideget方法的桥接方法.

情况

这是一些无法修改的任意预先存在的类型结构的代码.

public abstract class A
{
    public abstract int X { get; }
}
public class B : A
{
    public override int X { get { return 0; } }
}
Run Code Online (Sandbox Code Playgroud)

问题

我们想编写这段代码,但不会编译.

public class C : B    // won't compile: X can't have a 'set' method
{
    private int _x;
    public override int X { get { return _x; } set { _x = value; } }
}
Run Code Online (Sandbox Code Playgroud)

我们无论如何都要编写我们想要的代码,但我们声明属性new代替override,允许我们声明一个set方法.

public class D : C    // Same thing, but will compile because X is 'new'
{
    private int _x;
    public new virtual int X { get { return this._x; } set { this._x = value; } }  // also 'virtual', unless we want to 'sealed' it.

    //  Bridge method provides the override functionality:
    protected sealed override int XGetter { get { return this.X; } }  // 'sealed' because this bridge should always refer to the new 'get' method
}
Run Code Online (Sandbox Code Playgroud)

额外的桥接方法XGetter提供了override.这是使用中间层粘贴到基类结构:

public abstract class C : B  //abstract intermediate layer
{
    //  Override-and-seal the base property's getter.
    public sealed override int X { get { return this.XGetter; }  }

    //  Define the bridge property for the new class to override.
    protected abstract int XGetter { get; }
}
Run Code Online (Sandbox Code Playgroud)

我认为D现在它等同于继承的类,B同时也能够在setter中重写.它是否正确?

Nat*_*n R 3

请小心您的解决方案,因为它隐藏了 A 和 B 的原始意图。话虽这么说,您的解决方案确实有效,即使在转换为基类时也是如此。

例子:

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

Assert.AreEqual(2, b.X);
Run Code Online (Sandbox Code Playgroud)

如果可以修改基类,我建议使用反射。