c#T的实例

时间:2012-04-03 12:32:01

标签: c# .net generics

我正在尝试创建一个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
{

}

4 个答案:

答案 0 :(得分:8)

<强>更新 修正了代码/拼写错误

使用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
{

}

答案 1 :(得分:2)

您可能希望查看ISerializable,而不是创建自己的。{/ p>

答案 2 :(得分:1)

如果你的类型都有一个默认的构造函数,或者如果它们有一个是明智的,那么你可以简单地在t参数中添加一个约束来请求一个默认参数,你注释掉的代码就是合法的

  public static T Deserialize<T>(byte[] Data) where T : Data, new()
        {
            new T().Deserialize(Data);
        }

答案 3 :(得分:0)

尝试:

Data val = System.Activator.CreateInstance(typeof(T)) as Data;

然后

   val.Deserialize(Data);