替换类中的类实例

时间:2013-02-11 15:04:30

标签: c# class runtime this

我有抽象类A,可以将自己序列化为byte[]

另一个类C使用类型T进行参数化,该类型应该是A或从C继承而且具有无参数构造函数。 T需要在byte[]Class C <T> where T : A, new() { ... } 之间进行双向转换。

T

问题是:如何从byte[]获取A

我无法使用T(byte[])中的某些静态方法,因为我无法覆盖它。我无法调用T,因为C#不允许它。

我找到的唯一方法是创建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 */ } } 的新对象。 有没有更好的解决方案或任何方式做某事:

{{1}}

2 个答案:

答案 0 :(得分: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
  }
}

答案 1 :(得分:0)

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

这个想法是用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
    }
}