如何在运行时访问派生的 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
更快,并且实现样板不是很高。
大家好,考虑到比较字段仅存在于派生 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
更快,并且实现样板不是很高。