c#调用对象类型的通用返回类型



我正在制作一个类来抽象一些功能,我将在我的项目中的多个其他类中使用。这个类可以将对象转换为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);
}
}

此代码按预期工作;然而,我想简化CopyDesirialize函数的语法。目前,一个调用看起来像这个copy = descendantClassInstance.Copy<descendantClass>(),这是冗长的,也留下了错误的空间,copy = otherdescendantClassInstance.Copy<descendantClass>()将编译,但在运行时产生一个错误。我更喜欢根据调用对象的类型自动推断返回类型,如copy = descendantClassInstance.Copy(),而不重写每个后代类中的CopyDesirialize方法。

我该怎么做?

编辑:

扩展似乎是实现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>
{
}

这可能是可接受的,也可能是不可接受的,这取决于你的用例。

相关内容

  • 没有找到相关文章

最新更新