c# - 从超类访问子类的类型
问题描述
我有一个超类MySuperclass
,和 2 个子类MySuperclass
;MySubclass1
和MySubclass2
。我希望能够调用依赖于子类类型的实例方法。
例如,我希望能够调用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()
为每个子类重写方法
解决方案
感谢@Charlieface 提供指向此解释的链接。
此实现有效,您需要转换为T
.
public class MySuperclass<T> where T : MySuperclass<T>
{
public byte[] SerializeToBytes()
=> Json.SerializeToBytes((T)this);
}
public class MySubclass1 : MySuperclass<MySubclass1>
{
...
}
推荐阅读
- python - 获取嵌套迭代的特定键并检查其值是否存在于列表中
- java - 无法与远程服务器上的 RMI Registry 建立连接
- r - Truncation of database name and columns while connecting to SQL database from R
- php - 如何使用 php 创建零日期时间?
- javascript - axios typescript 自定义 AxiosRequestConfig
- python - 每次导航到新页面时,Selenium 都会将我注销,我该如何阻止这种情况发生?
- javascript - How to make javascript handle 'ESCAPE(\u001B)' character?
- fortran - 在fortran中使用dreal函数
- batch-file - 超过一定年龄的循环处理文件的批处理文件
- javascript - 如何制作像 Wikipedia 和 Facebook 这样的悬停效果