C# 泛型 Return 调用对象类型的类型

C# Generic Return Type of Calling Object Type

我正在制作一个 class 来抽象一些我将在我的项目中的多个其他 class 中使用的功能。此 class 将对象与 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>() 会编译但在运行时产生错误。我希望根据调用对象的类型自动推断出 return 类型,例如 copy = descendantClassInstance.Copy(),而不覆盖每个后代 [=36] 中的 CopyDesirialize 方法=].

我该怎么做?

编辑:

扩展似乎是根据需要实施 Copy 的可能途径。但是,我也想要 Deserialize 的类似功能,它是静态的。从 here 开始,扩展似乎不可行。

可接受的答案将处理这两种情况。

您可以通过扩展方法实现:

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>
{
}

但是,请注意,如果您希望 class 的更多后代具有派生类型最多的类型,则需要继续链:

public class Base<T> : Serializable<T> where T : Base<T>
{
}

public class Derived : Base<Derived>
{
}

这可能会或可能不会被接受,具体取决于您的用例。