大家先看一段简单的代码,我想实现的是基类简单赋值,而不是考属性一个个的来赋值。
public class A
{
public int p1 {
get;
set;
}
}
public class B : A
{
public B(A data) {
base = data;
}
}
base是基类的引用,当实例化B的时候,B的引用实际上和base是一样的,
而一个类的实例是无法在自身内部修改自己的引用地址的
一般的解决方法是实现Clone,通过Clone拷贝值.当然,实现Clone实际也是
要写类似 base.p1 = data.p1 这样的语句的.
如果基类A是相对稳定的,那么让A实现Clone,写一次属性赋值,也不是很难看的
解决方案.
如果实际中,你是有很多这样的基类A,那么用反射来实现Clone的功能是可以大大
减少代码量,其代价则是性能.
如果你的基类A支持序列化,使用序列化来实现Clone功能,也是可以的.
最后一种方式,是使用序列化,准确的说,是封送(C++里一直说的是序列化,在.NET里为了区别,使用了COM中相关的称谓),通过往指定地址空间写入指定大小的数据,达到更改类实例字段值的目的.
//测试类
[StructLayout(LayoutKind.Sequential)]
public class TestClassBase
{
public string Text { get; set; }
public int Order { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public class TestClass : TestClassBase
{
public TestClass(TestClassBase data)
{
if (data == null)
return;
int size = Marshal.SizeOf(data);
if (size == 0)
return;
IntPtr ptr = IntPtr.Zero;
try
{
ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(data, ptr, true);
Marshal.PtrToStructure(ptr, this);
}
finally
{
if (ptr != IntPtr.Zero)
Marshal.FreeHGlobal(ptr);
}
}
}
//测试方法
TestClassBase obj1 = new TestClassBase { Order=2, Text = "基类"};
TestClass obj = new TestClass(obj1);
兄弟 你要改变它什么,既然是子类,已经是完全继承了,你为什么还要给父类赋值呢?不好也不规范
先回答楼主的问题,再评论楼主的做法。
1、注意到base=data 这里的时候是错误的,编译也不通过,请问大家这是为什么呢?base的具体含义究竟是什么?
因为base代表的是基类,data是实例,把实例覆给类就好比B=new B()一样,显然是不行的。
2、请问大家有什么解决的办法没?
就用你说算了的方法。
不知道楼主有没有注意到,public B(A data)中data产生的时候你是要对它进行一次属性赋值的,也就是说对A的属性一个个赋值你是无法避免的。