gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:39:24 24 4
gpt4 key购买 nike

更新:这个问题已被修改以使其更清楚。下面的答案似乎反射(reflect)了这种方法很有效。希望这个问题可以帮助那些需要向现有属性添加 getset 的人。


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

一般的想法是创建一个新的属性而不是直接覆盖旧的,然后我们创建一个覆盖的桥接方法是调用新方法的旧 get 方法。

情况

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

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

问题

我们想编写这段代码,但无法编译。

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; } }
}

解决方案

无论如何我们都写了我们想要的代码,但是我们声明属性是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
}

额外的桥接方法 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; }
}

我认为 D 现在等同于从 B 继承的类,同时还能够在 setter 中覆盖。这是正确的吗?

最佳答案

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

例子:

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

Assert.AreEqual(2, b.X);

如果可以修改基类,我推荐使用反射。

关于c# - 如何在 C# 中使用 setter 覆盖 getter-only 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22210971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com