当我想扩展现有对象时,我创建了自己的继承子句,并且工作得非常好...问题就在于我想要使用这个新对象而不是原始的,填充部分是“痛苦”。
是否有任何AUTO POPULATE方式?
原始对象:客户 我的对象: CustomerWithGroup
public class CustomerWithGroup : Customer
{
public CustomerWithGroup() { }
public string GroupName { get; set; }
public string Fullname
{
get
{
return string.Format("{0} {1} {2}", firstname, middlename, lastname).Replace(" ", " ");
}
}
}
我正在填充它:
customerswithgroup = new List<CustomerWithGroup>();
string groupname;
foreach (Customer c in customers)
{
groupname = customergroup.Find(x => x.customer_group_id == c.group_id).customer_group_code;
customerswithgroups.Add(
new CustomerWithGroup {
GroupName = groupname,
created_at = c.created_at, customer_id = c.customer_id, default_billing = c.default_billing, default_shipping = c.default_shipping, email = c.email, firstname = c.firstname, group_id = c.group_id, increment_id = c.increment_id, lastname = c.lastname, middlename = c.middlename, password_hash = c.password_hash, prefix = c.prefix, store_id = c.store_id, suffix = c.suffix, taxvat = c.taxvat, updated_at = c.updated_at, website_id = c.website_id });
}
这是一堆代码!而且你可以想象为真正的大物体做这件事!
没有办法说明,比如
Hei对象,请从此对象加载所有基本成员!
newCG = new CustomerWithGroup().LoadFromBase(c);
newCG.groupName = "my group";
customerswithgroup.Add( newCG );
我们可以使用任何技巧吗?
答案 0 :(得分:2)
不,没有简单的方法。你可以使用反射并写一堆代码来做到这一点,但这将是很多工作。
在我看来,你应该重新考虑你的设计。在这种情况下,继承不是一个好的解决方案,这里的组合更好,如下:
public class CustomerWithGroups
{
public CustomerWithGroups(Customer c) { Customer = c; }
public Customer Customer { get; private set; }
public string GroupName { get; set; }
public string Fullname
{
get
{
return string.Format("{0} {1} {2}", Customer.firstname, Customer.middlename, Customer.lastname).Replace(" ", " ");
}
}
}
答案 1 :(得分:1)
您无法轻易自动执行此操作。
您可以在派生类中创建一个构造函数或方法,该构造函数或方法接受基类的实例并复制所有属性。 (你仍然需要手工编写,但你只需要编写一次)
如果您确实想自动执行此操作,可以使用反射循环遍历属性并创建一个表达式树,从原始文件中复制它们。
但是,最好的方法是使用has-a关系,使CustomerWithGroups
不继承Customer
,而是拥有Customer
类型的只读Customer
属性