C# c.T的实例

C# c.T的实例,c#,.net,generics,C#,.net,Generics,我试图编写一个genric代码来序列化和反序列化实现特定接口的任何对象。问题是我需要先创建一个对象的实例,然后才能调用.Deserialize,因为不能在接口中使用静态函数。现在我的问题是,我如何做一个T的例子?还是有更好的方法来实现我的目标 尝试: 然后 val.Deserialize(Data); 尝试: 然后 val.Deserialize(Data); 您可能希望查看哪个用于此目的,而不是创建自己的。您可能希望查看哪个用于此目的,而不是创建自己的。更新 修正了代码/打字错

我试图编写一个genric代码来序列化和反序列化实现特定接口的任何对象。问题是我需要先创建一个对象的实例,然后才能调用.Deserialize,因为不能在接口中使用静态函数。现在我的问题是,我如何做一个T的例子?还是有更好的方法来实现我的目标

尝试:

然后

   val.Deserialize(Data);
尝试:

然后

   val.Deserialize(Data);
您可能希望查看哪个用于此目的,而不是创建自己的。

您可能希望查看哪个用于此目的,而不是创建自己的。

更新 修正了代码/打字错误

使用新关键字

更新 修正了代码/打字错误

使用新关键字


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

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

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

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


您需要一个一次性实例这一事实表明存在一些设计问题。请确保所有接口名称都以大写字母I开头。例如IData,而不仅仅是数据。@HenkHolterman那么什么是更好的设计?我希望有一个方法可以序列化实现接口的任何类。您需要一个一次性实例这一事实表明存在一些设计问题。请确保所有接口名称都以大写字母I开头。像IData,而不仅仅是数据。@HenkHolterman那么什么设计更好?我希望有一个方法可以序列化实现接口的任何类。@HenkHolterman我考虑过这个问题,但我认为这可能真的是答案,因为这似乎是在创建一些已经存在的东西。你是否仍然不同意……我可以把它改成评论。@Henkholtman我考虑过,但我认为这可能真的是答案,因为这似乎创造了一些已经存在的东西。您是否仍然不同意…我可以将其更改为注释。命名空间“System.Reflection”中不存在类型或命名空间名称“Activator”。是否缺少程序集引用?我需要包含引用吗?如果你真的要使用默认构造函数,那么为什么不把它作为T的一个通用约束呢?这将使新的T合法,并且在类型没有adefault的情况下,将在编译时而不是运行时失败constructor@Svexo,抱歉,这是System.Activator。我为此更新了。如果Rune FS是正确的,您应该对T进行约束,以确保其有效。命名空间“System.Reflection”中不存在类型或命名空间名称“Activator”。是否缺少程序集引用?我需要包含引用吗?如果你真的要使用默认构造函数,那么为什么不把它作为T的一个通用约束呢?这将使新的T合法,并且在类型没有adefault的情况下,将在编译时而不是运行时失败constructor@Svexo,抱歉,这是System.Activator。我为此更新了。符文FS是对的,你应该对T做一个约束,以确保它能工作。这确实回答了直接的问题。但如果T是可识别的,或者只是一般来说很贵,那该怎么办呢?只是写了同样的东西。请注意,公共无参数构造函数将是强制性的,但如果需要序列化,这不是主要约束。只想悄悄地提到一个小错误,即您在数据接口方法上有访问修饰符,这显然是从问题中复制的:@ja72:这并不总是可以接受的。但是IDisposable对象通常是不可序列化的。当然,在T实现IDisposable的地方,您可以添加类似if T as IDisposable!=null{T.Dispose;}。这确实回答了直接的问题。但如果T是可识别的,或者只是一般来说很贵,那该怎么办呢?只是写了同样的东西。请注意,公共无参数构造函数将是强制性的,但如果需要序列化,这不是主要约束。只想悄悄地提到一个小错误,即您在数据接口方法上有访问修饰符,这显然是从问题中复制的:@ja72:这并不总是可以接受的。但是IDisposable对象通常是不可序列化的。当然,在T实现IDisposable的地方,您可以添加类似if T as IDisposable!=null{T.Dispose;}。无法创建变量类型“T”的实例,因为它没有新的约束。这就是我问这个问题的原因,我尝试了这种方法,但出现了错误。@Svexo,现在我忘记了,new无法创建变量类型“T”的实例,因为它没有新的约束。这就是我问这个问题的原因,我试过这样做,但还是出错了。@Svexo, 哦,我忘了,新的
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
{

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