从子类的父类访问子类的类型



我有一个超类MySuperclassMySuperclass的2个子类;MySubclass1MySubclass2。我希望能够调用依赖于子类类型的实例方法。

例如,我希望能够在MySuperclass的子类的任何实例上调用MySubclass.Serialize(),并让它在该对象上调用Json.SerializeToBytes<T>(T toSerialize),替换T

public class MySuperclass 
{
// of course, this does not work.
public byte[] SerializeToBytes() 
=> Json.SerializeToBytes<typeof(this)>(this); 
}
public class MySubclass1 : MySuperclass
{
...
}
public class MySubclass2 : MySuperclass
{
...
}

然后我可以做:

byte[] bytes; 
var mySubclass1Object = new MySubClass1();
bytes = mySubclass1Object.SerializeToBytes();
// the above is equivalent to (though the type parameter would normally be implied)
bytes = Json.SerializeToBytes<MySubclass1>(mySubclass1Object);

我怎样才能做到这一点?


根据评论的请求,我使用的库是Utf8Json库。Json.SerializeToBytes<T>(T toSerialize)定义为:**

public static byte[] SerializeToBytes<T>(T obj)
{
return JsonSerializer.Serialize<T>(obj);
}

脚注

*我找到了这篇文章。但这并没有回答我的问题。在这种情况下,它们可以只使用超类的类型来引用子类,但是在这里,序列化器需要访问子类及其所有额外的方法和属性才能正确地序列化它。它们也没有将类型作为类型参数传递给某些方法,而我需要这样做。

**我希望这是可以在其他情况下使用的东西,在那里我可以从父类中定义的方法访问子类的类型。

我不想使用override,因为它需要我为每个子类重写.Serialize()方法

感谢@Charlieface提供的链接。

这个实现可以工作,您需要强制转换为T

public class MySuperclass<T> where T : MySuperclass<T>
{
public byte[] SerializeToBytes() 
=> Json.SerializeToBytes((T)this); 
}
public class MySubclass1 : MySuperclass<MySubclass1>
{
...
}

最新更新