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#以外的另一种语言。我相信你真的不在乎内存地址,是吗 如果是这样的话,你能仅仅修改一个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);