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

C# 更改C中实例化对象的类型#,c#,.net,.net-4.0,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)(比如4个字节)的内存,它的起始地址是0x100 然后在某个地方,我决定将o的类型更改为ClassB,并添加y的值。 所以

考虑以下类别:

class ClassA
{
    public int x;
}


class ClassB : ClassA
{
    public int y;
}
然后,在代码的某个地方,我实例化了一个新的
ClassA

var o = new ClassA();
var anotherRef = o;
这意味着我得到了一块大小为
sizeof(ClassA)
(比如4个字节)的内存,它的起始地址是
0x100

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

在这种情况下,它将有利于另一个引用,因为它将引用一个正确的实例


可以在C#中执行类似操作吗?

简而言之:不,在C#中不能执行此操作

  • 您不能将
    ClassB
    分配给
    o
    ,因为它是强类型的
    ClassA
  • (没有真正的黑客)你无法控制C#中的内存分配或位置

  • 如果你想玩这种把戏,你需要C#以外的另一种语言。

    我相信你真的不在乎内存地址,是吗

    如果是这样的话,你能仅仅修改一个B类吗,例如通过添加一个ctor

    B(A a) {
        this.x=a.x;
    }
    
    然后通过以下方式将A“转换”为B:

    B converted = new B(yourOldA);
    

    不,不是真的。创建后不能更改对象的类型。C#是一种静态类型语言。你想达到什么目标?很可能会有一种不这样做的方法。你想实现什么,为什么要实现这样的目标?当你说address
    0x100
    时,它不是固定的。GC有权随时将其移动。@Baldrick我已经从数据库中加载了类型为
    ClassA
    的o,在某个地方我知道它的真实类型是
    ClassB
    ,并且该部分在另一个表中。但当软件做了一些工作时,又创建了另一个参考。我希望以其他引用不会中断的方式更新
    o
    的类型。@SriramSakthivel通过地址,我的意思是我希望其他引用正常工作。地址是否改变并不重要。但引用必须相同。不可能。我建议您在这两个类中都实现一个通用的
    接口
    抽象类
    ,并使用没有具体类型的接口。如果您不能修改B,您可以创建一个新的类,一种包装器(通过扩展B),问题是将
    转换为
    引用为
    a
    。您的解决方案是创建一个类似于
    a
    的新实例,而不是扩展
    a
    B converted = new B(yourOldA);