2010-01-31 56 views
1

當我想延長現有對象創建我自己的,並使用繼承條款,以及夢幻般的工作......問題是,當我想用​​的,而不是原來的這個新對象,填充部分是一個「痛苦」。繼承對象和自動填充

有沒有這樣做的自動人羣的方式?

原來的對象:客戶 我的對象: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 }); 
} 

這是一個一串代碼!你可以想象爲真正的大物體做這件事!

Ins't有說服力的方式,像

喜對象,請加載所有的基地成員從該對象!

newCG = new CustomerWithGroup().LoadFromBase(c); 
newCG.groupName = "my group"; 
customerswithgroup.Add(newCG); 

有沒有我們可以使用任何把戲?

+0

你的意思是「class」而不是「object」,對吧? – 2010-01-31 13:10:24

+0

如果它只有一個組,它爲什麼叫'CustomerWithGroups'? – SLaks 2010-01-31 13:14:30

+0

@Konrad:Class == Business Object,不是對象的類型。 @SLaks:輸入錯誤:D – balexandre 2010-01-31 13:35:04

回答

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(" ", " "); 
     } 
    } 
} 
+0

我選擇你的接受答案,因爲你有代碼,並且Slaks有超過24000點:D(即使我不需要,它總是很好的顯示代碼示例) – balexandre 2010-01-31 13:33:23

1

你不能輕易地自動做到這一點。

您可以在派生類中創建一個構造函數或方法,該構造函數或方法接收基類的一個實例並複製所有屬性。 (你仍然需要手工編寫它,但你只需要寫一次)

如果你真的想自動執行它,你可以使用反射循環遍歷屬性,並建立一個表達式樹從原件複製它們。

然而,最好的方法是使用一個具有-的關係,使得CustomerWithGroups不會繼承Customer,而是有Customer類型的只讀屬性Customer

+0

humm ...好主意:) – balexandre 2010-01-31 13:30:57

+0

也許是一個輕率的評論:我想知道如果在將一個結構分配給另一個結構(當然是同一個Struct定義的實例)時發生的內部值的「自動複製」可能是利用這裏複製所有的字段(假設它們都是值類型)。 – BillW 2010-01-31 14:44:40

+0

@ BillW:No;值類型不能有基本類型。 – SLaks 2010-01-31 14:47:45