首页 > 解决方案 > 从超类访问子类的类型

问题描述

我有一个超类MySuperclass,和 2 个子类MySuperclassMySubclass1MySubclass2。我希望能够调用依赖于子类类型的实例方法。

例如,我希望能够调用MySubclass.Serialize()子类的任何实例MySuperclass并让它调用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()为每个子类重写方法

标签: c#.netoop

解决方案


感谢@Charlieface 提供指向此解释的链接。

此实现有效,您需要转换为T.

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

public class MySubclass1 : MySuperclass<MySubclass1>
{
    ...
}

推荐阅读