c# - 调用对象类型的 C# 通用返回类型
问题描述
我正在创建一个类来抽象一些我将在我的项目中的多个其他类中使用的功能。此类将对象与 JSON 以及深拷贝对象相互转换。
public abstract class Serializable
{
public T Copy<T>()
{
return Deserialize<T>(Serialize());
}
public string Serialize()
{
return JsonConvert.SerializeObject(this);
}
public static T Deserialize<T>(string json)
{
return JsonConvert.DeserializeObject<T>(json);
}
}
此代码按预期工作;但是,我想简化Copy
andDesirialize
函数的语法。目前,一个调用看起来像这样copy = descendantClassInstance.Copy<descendantClass>()
,它很冗长,也给错误留下了空间,因为它copy = otherdescendantClassInstance.Copy<descendantClass>()
会编译但在运行时会产生错误。我希望根据调用对象的类型自动推断返回类型,例如copy = descendantClassInstance.Copy()
,而不覆盖每个后代类中的Copy
orDesirialize
方法。
我怎样才能做到这一点?
编辑:
扩展似乎是Copy
根据需要实施的可能途径。但是,我也想要类似的功能Deserialize
,它是静态的。从这里开始,扩展似乎不可行。
可接受的答案将处理这两种情况。
解决方案
您可以通过扩展方法实现它:
public static class SerializableExtension
{
public static T Copy<T>(this T instance) where T: Serializable
{
return Serializable.Deserialize<T>(instance.Serialize());
}
}
示例用法:
public class A: Serializable
{
}
public class B
{
public void SomeMethod(A item)
{
var newItem = item.Copy();
}
}
推荐阅读
- c++ - C++中常量初始化和零初始化顺序的矛盾定义
- vim - 有没有办法在vim中向上或向下复制选定区域?
- flutter - 如何在 Flutter 中更新现有文件(Path_Provider)
- r - 错误:连接到互联网时,如果没有互联网,天桥查询不可用
- php - 如何防止 Laravel 应用程序文件夹被搜索引擎索引
- slack - slack huddle 没有突然出现
- flutter - Flutter 中的 SearchDelegate:在 null 上调用了“where”方法
- html - 如何在引导手风琴的标题上添加按钮,以便单击它不会折叠或展开它?
- html - 反应性 R 闪亮与 HTML:NA 值保存问题
- ruby-on-rails - Rails 按键分组哈希数组