如何在运行时访问派生的 class 字段?

How to access derived class field at runtime?

大家好,考虑到比较字段仅存在于派生 class 中,有没有办法在派生 class 的基础 class 中实现 Equals 方法es:

    public abstract partial class Primitive {
                public abstract PrimitiveKind PrimitiveKind { get; }
public static Primitive CreateEmpty(PrimitiveKind primitiveKind) {
                switch (primitiveKind) {
                    case PrimitiveKind.Bool: return new Bool();
                    case PrimitiveKind.String: return new String();
                    case PrimitiveKind.Char: return new Char();

                    case PrimitiveKind.Sbyte: return new Sbyte();
                    case PrimitiveKind.Byte: return new Byte();
                    case PrimitiveKind.Short: return new Short();
                    case PrimitiveKind.Ushort: return new Ushort();
                    case PrimitiveKind.Int: return new Int();
                    case PrimitiveKind.Uint: return new Uint();
                    case PrimitiveKind.Long: return new Long();
                    case PrimitiveKind.Ulong: return new Ulong();


                    case PrimitiveKind.Float: return new Float();
                    case PrimitiveKind.Double: return new Double();
                    case PrimitiveKind.Decimal: return new Decimal();
                    default:
                        throw new NotImplementedException();
                }
            }
    }

每个 Derived 类型如下所示:

 public sealed class Bool : Primitive {

                    public bool Value { get; set; }
                    public override PrimitiveKind PrimitiveKind => PrimitiveKind.Bool;
            }
public sealed class Byte : Primitive {

                public byte Value { get; set; }
                public override PrimitiveKind PrimitiveKind => PrimitiveKind.Byte;
            }

我希望 Primitive 类型重写 Equals 方法,以便它在运行时比较 Value field.I 出于测试目的需要在此处完成相等。

类似于:

class Primitive{
    public bool override Equals<T>(T other)
    {
    return  `(T)((dynamic)this.[Value])` .Equals(other.Value);
    }

值在基 class 中不存在 - 无论如何我可以 "pretend" 它在运行时存在吗?dynamic 词是这里的关键吗? (我不是很熟悉它的用法) }

用法:

Primitive a=new Bool();
Primitive b=new Bool();
Assert.AreEqual(a,b);

您可以创建一个受保护的摘要 属性,您的 类 必须实施:

public abstract partial class Primitive
{
    protected abstract object ValueObject { get; }
    public override bool Equals(object obj)
    {
        return obj is Primitive p ? this.ValueObject.Equals(p.ValueObject) : false;
    }
    ...
}

public sealed class Bool : Primitive
{
    protected override object ValueObject => this.Value;
    public bool Value { get; set; }
    public override PrimitiveKind PrimitiveKind => PrimitiveKind.Bool;
}

此解决方案会导致在获取 ValueObject 时对值进行装箱,但它仍然可能比 dynamic 更快,并且实现样板不是很高。