首页 > 解决方案 > 调用对象类型的 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);
    }
}

此代码按预期工作;但是,我想简化CopyandDesirialize函数的语法。目前,一个调用看起来像这样copy = descendantClassInstance.Copy<descendantClass>(),它很冗长,也给错误留下了空间,因为它copy = otherdescendantClassInstance.Copy<descendantClass>()会编译但在运行时会产生错误。我希望根据调用对象的类型自动推断返回类型,例如copy = descendantClassInstance.Copy(),而不覆盖每个后代类中的CopyorDesirialize方法。

我怎样才能做到这一点?

编辑:

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

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

标签: c#methodsreflectionextension-methods

解决方案


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

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();
    }
}

推荐阅读