2010-03-02 73 views
0

我不知道如何使用「T」,但我從來沒有很好地理解它,但我確信答案會駐留在它周圍的任何東西......重構:如何重構未知類型?

我有一個巨大的開關,所有它是適用的一個屬性,對象和控件添加到集合,一種提取物>應用屬性>添加,如:

1開關

foreach (AdwizaControl control in form.AdwizaControls) 
{ 
    Panel panel = new Panel(); 
    int x = 0, y = 0; 
    switch (control.Type) 
    { 

     case ControlType.CheckBox: 
      AdwizaCheckBox checkbox = (AdwizaCheckBox)control.AdwizaWebControl; 
      x = checkbox.X; 
      y = checkbox.Y; 
      panel.Controls.Add(checkbox); 
      break; 
     case ControlType.Bevel: 
      AdwizaBevel bevel = (AdwizaBevel)control.AdwizaWebControl; 
      bevel.Width = bevel.W; 
      bevel.Height = bevel.H; 
      panel.Controls.Add(bevel); 
      break; 

checkbox.X和checkbox.Y是來自定義XML的屬性,在這裏我們將控制設置爲

...

第二開關(遍歷是一個RadPageView(Telerik的部件內部對照)

foreach (RadPageView pageView in multiPage.PageViews) 
{ 
    int controlCount = pageView.Controls.Count; 

    for (int i = 0; i < controlCount; i++) 
    { 
     if (pageView.Controls[i].GetType() == typeof(AdwizaControl)) 
     { 
      switch (((AdwizaControl)pageView.Controls[i]).Type) 
      { 

...

case ControlType.Grid: 
    AdwizaGrid pageViewGrid = (AdwizaGrid)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
    pageViewGrid.Attributes.Add(
     "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewGrid.Y + increaseY, pageViewGrid.X + increaseX)); 
    pageView.Controls.Add(pageViewGrid); 
    break; 
case ControlType.Hyperlink: 
    AdwizaHyperlink pageViewHyperlink = (AdwizaHyperlink)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
    pageViewHyperlink.Attributes.Add(
     "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewHyperlink.Y + increaseY, pageViewHyperlink.X + increaseX)); 
    pageView.Controls.Add(pageViewHyperlink); 
    break; 
case ControlType.ImageBox: 
    AdwizaImageBox pageViewImageBox = (AdwizaImageBox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
    pageViewImageBox.Attributes.Add(
     "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewImageBox.Y + increaseY, pageViewImageBox.X + increaseX)); 
    pageView.Controls.Add(pageViewImageBox); 
    break; 
case ControlType.Label: 
    AdwizaLabel pageViewlabel = (AdwizaLabel)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
    pageViewlabel.Attributes.Add(
     "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewlabel.Y + increaseY, pageViewlabel.X + increaseX)); 
    pageView.Controls.Add(pageViewlabel); 
    break; 
case ControlType.Slavebox: 
    AdwizaSlavebox pageViewSlavebox = (AdwizaSlavebox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
    pageViewSlavebox.Attributes.Add(
     "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewSlavebox.Y + increaseY, pageViewSlavebox.X + increaseX)); 

    pageView.Controls.Add(pageViewSlavebox); 
    break; 
case ControlType.Repeatbox: 
    AdwizaRepeatBox pageViewrepeatbox = (AdwizaRepeatBox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
    pageViewrepeatbox.Attributes.Add(
     "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewrepeatbox.Y + increaseY, pageViewrepeatbox.X + increaseX)); 
    pageView.Controls.Add(pageViewrepeatbox); 
    break; 

它是作爲大它必須覆蓋我使用的所有對象...

我該如何在這個簡單的電話?像這樣:

ApplyPositionAttribute(
    ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl); 

有沒有辦法簡化這個?


新增 switch語句

回答

0

如果AdwizaRepeatBox,AdwizaRepeatBox,AdwizaSlavebox等不延長該具有財產屬性比你更好的搜索反射命名空間的答案單個類或重寫你的代碼,這樣如果他們延長單,他們將擴大單級

類比你正在尋找的應該是這樣的代碼:

private void ApplyPositionAttribute<T>(AdwizaWebControl webControl) where T : InheritedClass 
{ 
    /* ... */ 

    T adwizalControl = (T)webControl; 
    pageViewrepeatbox.Attributes.Add(
     "style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewrepeatbox.Y + increaseY, pageViewrepeatbox.X + increaseX)); 
    pageView.Controls.Add(pageViewrepeatbox); 
} 

編輯

使用這個命令所有adwizaControl前傾向於具有屬性屬性的單個類。如果擴展X和Y屬性,則使用virtual關鍵字來覆蓋基類聲明

AdwizaWebControl webControl = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
webControl.Attributes.Add("style", string.Format("position:absolute;top:{0}px;left:{1}px;", webControl.Y + increaseY, webControl.X + increaseX)); 
pageView.Controls.Add(webControl); 
+0

此外它將有助於查看switch語句。 – 2010-03-02 08:49:24

+0

添加了開關啓動代碼:) - dang ...我永遠不會知道T是多麼的神奇: -/ – balexandre 2010-03-02 09:52:11

+0

是屬性屬性是AdwizaWebControl的一部分嗎?如果這是真的,我不知道爲什麼你需要投入實施(AdwizaLabel,AdwizalSlavebox等)。檢查修改的代碼答案 – 2010-03-02 10:16:16

0

據我所知,所有的類AdwizaGridAdwizaHyperlink等有AdwizaControl作爲共同的基類。我還假設Attributes是在基類中定義的。那麼情況後

AdwizaControl control; 

case ControlType.Grid: 
    control = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
    break; 
case ControlType.Hyperlink: 
    control = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
    break; 
... 

:在這種情況下,您可以刪除重複的很大一部分這樣的

control.Attributes.Add(
     "style", string.Format("position:absolute;top:{0}px;left:{1}px;", 
     control.Y + increaseY, control.X + increaseX)); 
pageView.Controls.Add(control); 

在此之後,你可以用某種映射從更換大型交換機控制類型屬性(我不熟悉C#所以我不能給你一個確切的提示,但例如在C++中,你可以使用函數或指向成員的指針)。

0

在這種情況下,您不必使用泛型。如果你所有的控件從AdvizaWebControl繼承,你可以只寫某事像這樣:

AdwizaWebControl webControl = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl; 
webControl.Attributes.Add("style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewGrid.Y + increaseY, pageViewGrid.X + increaseX)); 
pageView.Controls.Add(webControl); 

但是,如果你的類不從AdwizaWebControl仿製藥繼承也無濟於事。