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);
}
}
此代码按预期工作;但是,我想简化 Copy
和 Desirialize
函数的语法。目前,一个调用看起来像这样 copy = descendantClassInstance.Copy<descendantClass>()
,它很冗长,也留下了错误的空间,因为 copy = otherdescendantClassInstance.Copy<descendantClass>()
会编译但在运行时产生错误。我希望根据调用对象的类型自动推断出 return 类型,例如 copy = descendantClassInstance.Copy()
,而不覆盖每个后代 [=36] 中的 Copy
或 Desirialize
方法=].
我该怎么做?
编辑:
扩展似乎是根据需要实施 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>
{
}
这可能会或可能不会被接受,具体取决于您的用例。
我正在制作一个 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);
}
}
此代码按预期工作;但是,我想简化 Copy
和 Desirialize
函数的语法。目前,一个调用看起来像这样 copy = descendantClassInstance.Copy<descendantClass>()
,它很冗长,也留下了错误的空间,因为 copy = otherdescendantClassInstance.Copy<descendantClass>()
会编译但在运行时产生错误。我希望根据调用对象的类型自动推断出 return 类型,例如 copy = descendantClassInstance.Copy()
,而不覆盖每个后代 [=36] 中的 Copy
或 Desirialize
方法=].
我该怎么做?
编辑:
扩展似乎是根据需要实施 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>
{
}
这可能会或可能不会被接受,具体取决于您的用例。