1

我有抽象类A,它可以将自身序列化到byte[].

另一个类使用类型进行C参数化,T该类型应该是或继承自A并具有无参数构造函数。需要在和C之间进行双向转换。Tbyte[]

Class C <T> where T : A, new() { ... }

问题是:如何T获得byte[]

我不能使用来自 的一些静态方法A,因为我不能覆盖它。我不能打电话T(byte[]),因为 C# 不允许。

我发现的唯一方法是创建实例T并调用从 覆盖的一些方法A,即:

byte[] bytes; // some byte table
T someT = new T();
T.LoadFromBytes(bytes);

我会工作,但在很多情况下,我只能将字节转换为T. 有没有更好的解决方案或任何方法来做某事,比如:

public class SomeTClass : A
{
    public SomeTClass(){...}
    public void LoadFromBytes(byte[] bytes)
    {
        SomeTClass newT = Sth(bytes); /* new instance of SomeTClass
                                         is created from bytes */
        this = newT; /* can't do this, but I need to replace
                        current instance with the new one */
    }
}
4

2 回答 2

1

我设法解决了这个问题,但我不喜欢我创建的代码。

这个想法是用 T 参数化类 A 并创建抽象方法,如果它不是从模板类型中使用的,它将是静态的:

public abstract class A <T>
{
    public abstract byte[] Serialize();
    public abstract T Deserialize(byte[]); //should be static
}

C有新的要求:

public class C <T> where T : A <T>
{
    someMethod(...)
    {
        ...
        byte[] bytes; // some bytes
        T = new T().Deserialize(bytes); // should be T.Deserialize(bytes)
        ...
    }
}

和一些T实现:

public class SomeTClass : A<SomeTClass>
{
    public SomeTClass Deserialize(byte[])
    {
        //deserialization code
    }
}
于 2013-02-11T15:42:24.293 回答
0

看一下UpdateReference方法和反序列化实现。我认为您应该将反序列化方法设为farbic method. 它应该byte[]作为输入参数并返回您需要的类型的新实例。是你想要的吗?

class C <T> where T : IA, new()
{
  public T Data { get; set; }
  .....

  public UpdateReference()
  {
    byte[] data = GetBytesFromSomewhere();
    Data = AImpl.Deserialize(data);

    Data.UserfulMethod();
    Data.AnotherUserfulMethod();

    data = GetBytesFromSomewhere();
    Data = AImpl.Deserialize(data)

    Data.UserfulMethod();
    Data.AnotherUserfulMethod();
  }
}

public interface IA
{
  public byte[] Serialize();
  public A Deserialize(byte[] data);

  public string UsefuleMethod1();
  public int AnotherUsefulMethod();
}

public class AImpl : IA
{
  public byte[] Serialize()
  {
    //Concrete implementation serialization
  }

  public static IA Deserialize(byte[] data)
  {
    //Concrete implementation deserialization
  }
}
于 2013-02-11T15:20:22.660 回答