有没有办法将对象字段复制到派生类构造函数中的基类,而无需单独复制每个字段?
示例:
public class A
{
int prop1 { get; set; }
int prop2 { get; set; }
}
public class B : A
{
public B(A a)
{
//base = a; doesn't work.
base.prop1 = a.prop1;
base.prop2 = a.prop2;
}
}
A a = new A();
B b = new B(a);
答案 0 :(得分:0)
我无法理解你为什么要这样做
您正在将Base类的实例传递给派生类的构造函数。你想做什么?
您是否尝试过this = a
而不是base = a
?
答案 1 :(得分:0)
成员是私有的,因此您甚至无法从派生类访问它们。即使它们是protected
,您仍然无法在A
类的B
实例上访问它们。
为了在没有反思的情况下做到这一点,成员必须公开:
public class A
{
public int prop1 { get; set; }
public int prop2 { get; set; }
}
// Define other methods and classes here
public class B : A
{
public B(A a)
{
//base = a; doesn't work.
base.prop1 = a.prop1;
base.prop2 = a.prop2;
}
}
答案 2 :(得分:0)
public class A
{
public A(A a)
{
prop1 = a.prop1;
prop2 = a.prop2;
}
int prop1 { get; set; }
int prop2 { get; set; }
}
public class B : A
{
public B(A a) : base (a)
{
}
}
A a = new A();
B b = new B(a);
像这样的东西,虽然我不确定它是否在语法上是正确的,因为我没有编译它。您应该在子类的构造函数之后使用base关键字将其依赖项的值传递给基类。
编辑:但我刚刚意识到您正在将基类传递给子类。这是一个设计缺陷。
答案 3 :(得分:0)
听起来您想要将A
的所有属性添加到B
,而无需单独指定它们。如果您不想继续向构造函数添加新的,您可以使用反射为您完成工作。
public B(A a)
{
var bType = this.GetType();
// specify that we're only interested in public properties
var aProps = a.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
// iterate through all the public properties in A
foreach (var prop in aProps)
{
// for each A property, set the same B property to its value
bType.GetProperty(prop.Name).SetValue(this, prop.GetValue(a));
}
}
关于此的几点说明:
A
中的属性更改为公开。B
包含A
中的所有内容(因为它来自它)。答案 4 :(得分:-1)
如果你真的想这样做并且无法通过继承访问属性,那么你可以通过这样的反射来做:
{{1}}