c# Instance of T
本文关键字:of Instance | 更新日期: 2023-09-27 18:29:55
我正在尝试制作一个genric代码来序列化和反序列化实现特定接口的任何对象。问题是,在调用.Deserialize()之前,我需要创建一个对象的实例,因为不能在接口中使用静态函数。现在我的问题是如何创建T的实例?还是有更好的方法来实现我的目标?
public static class Serializer { public static byte[] Serialize<T>(T Obj) where T : Data; public static T Deserialize<T>(byte[] Data) where T : Data { //Here I need to something like: new T().Deserialize(Data); } } public interface Data { public byte[] Serialize<T>(T obj); public T Deserialize<T>(byte[] Data);
}
class Program
{
static void Main(string[] args)
{
Serializer.Deserialize<Dummy>(new byte[20]);
}
}
class Dummy : Data
{
}
更新修复了的代码/打字错误
使用new()
关键字
public interface IData
{
public byte[] Serialize<T>(T obj);
public T Deserialize<T>(byte[] Data);
}
public static class Serializer
{
public static byte[] Serialize<T>(T Obj) where T : IData;
public static T Deserialize<T>(byte[] data) where T : IData, new()
{
T res=new T();
res.Deserialize<T>(data);
return res;
}
}
class Program
{
static void Main(string[] args)
{
Serializer.Deserialize<Dummy>(new byte[20]);
}
}
class Dummy : IData
{
}
您可能希望查看用于此目的的ISerializable,而不是创建自己的。
如果您的类型都有默认构造函数,或者如果它们有一个默认构造函数是合理的,您可以简单地向请求默认参数的t参数添加一个约束,并且您注释掉的代码就是合法的
public static T Deserialize<T>(byte[] Data) where T : Data, new()
{
new T().Deserialize(Data);
}
尝试:
Data val = System.Activator.CreateInstance(typeof(T)) as Data;
然后
val.Deserialize(Data);