在C#中更改实例化对象的类型

时间:2013-11-18 06:36:45

标签: c# .net .net-4.0

考虑这些课程:

class ClassA
{
    public int x;
}


class ClassB : ClassA
{
    public int y;
}

然后,在代码中的某处我实例化一个新的ClassA

var o = new ClassA();
var anotherRef = o;

这意味着我从sizeof(ClassA)这样的地址开始获得大小为0x100(比如说​​4个字节)的一块内存。

然后我决定将o的类型更改为ClassB并添加y的值。 所以我希望o仍为0x100的地址,但大小为sizeof(ClassB)(比如说​​8个字节)。

SomeMagicToChangeType(o, new ClassB());
// Now anotherRef should be a ClassB

在这种情况下,它会对anotherRef有用,因为它将引用正确的实例。

是否有可能在C#中做这样的事情?

2 个答案:

答案 0 :(得分:2)

简而言之:不,你不能在C#中做到这一点。

  1. 您无法将ClassB分配给o,因为它是ClassA的强类型。
  2. (没有真正的hacky)你无法控制C#中的内存分配或位置。
  3. 如果你想做这种诡计,你需要另外一种语言而不是C#。

答案 1 :(得分:0)

我相信你真的不在乎记忆地址,是吗?

如果是这样,你可以修改一个B类,例如添加一个因子

B(A a) {
    this.x=a.x;
}

然后以某种方式“转换”你A到B:

B converted = new B(yourOldA);