继承对象和自动填充

时间:2010-01-31 13:08:12

标签: c# inheritance asp.net-3.5

当我想扩展现有对象时,我创建了自己的继承子句,并且工作得非常好...问题就在于我想要使用这个新对象而不是原始的,填充部分是“痛苦”。

是否有任何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 );

我们可以使用任何技巧吗?

2 个答案:

答案 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属性