重要:我无法使用属性,我需要序列化字段。 C#6.0
内容很简单,字段在基类中定义,另一个类从基类继承此字段。子类中的字段会更改其类型-重要的是该类型始终为枚举,但是序列化取决于枚举类型,因此必须进行强类型化。然后,通过调用子类中的某些方法,更改基类中的值会期望子类中的相同更改。不会发生,因为字段被标记为新字段,所以它具有自己的内存分配。如何在不告知子类克隆值的情况下更改此行为?
enum Foo { };
enum Bar { };
abstract class Base
{
protected Foo someEnum;
public void Load(int someVal)
{
someEnum = (Foo)someVal;
}
}
class Child : Base
{
public new Bar someEnum;
}
class Program
{
void Main()
{
var c = new Child();
c.Load(7);
Assert((int)c.someEnum == 7);
}
}
您可以使用泛型获得相当接近的效果。从c#7.3开始,可以对Enum
使用通用约束-这样就可以执行以下操作:
abstract class Base {
public abstract void Load(int someVal);
}
class Base<T> : Base
where T : Enum
{
protected T someEnum;
public override void Load(int someVal)
{
someEnum = (T)someVal;
}
}
class FooWrapper : Base<Foo> {/* implementation */}
class BarWrapper : Base<Bar> {/* implementation */}
现在FooWrapper
和BarWrapper
是兄弟姐妹,因此它们彼此不会继承,但是它们都继承了Base<T>
类并且继承了Base
类`