我正在制作一个类来抽象一些功能,我将在我的项目中的多个其他类中使用。这个类可以将对象转换为JSON或从JSON转换为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
和Desirialize
函数的语法。目前,一个调用看起来像这个copy = descendantClassInstance.Copy<descendantClass>()
,这是冗长的,也留下了错误的空间,copy = otherdescendantClassInstance.Copy<descendantClass>()
将编译,但在运行时产生一个错误。我更喜欢根据调用对象的类型自动推断返回类型,如copy = descendantClassInstance.Copy()
,而不重写每个后代类中的Copy
或Desirialize
方法。
我该怎么做?
编辑:
扩展似乎是实现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();
}
}
一个选择是使用
public abstract class Serializable<T>
{
public T Copy()
{
return Deserialize(Serialize());
}
public string Serialize()
{
return JsonConvert.SerializeObject(this);
}
public static T Deserialize(string json)
{
return JsonConvert.DeserializeObject<T>(json);
}
}
并像这样实现它:
public class Test : Serializable<Test>
{
}
但是,请注意,如果您希望类的进一步后代具有最派生的类型,则需要继续执行该链:
public class Base<T> : Serializable<T> where T : Base<T>
{
}
public class Derived : Base<Derived>
{
}
这可能是可接受的,也可能是不可接受的,这取决于你的用例。