2010-03-02 5 views
0

Je ne sais pas comment utiliser le "T" et je ne l'ai jamais très bien compris, mais je suis sûr que la réponse résidera dans tout ce qui l'entoure ...Refactorisation: Comment refactoriser avec un type inconnu?

J'ai un énorme interrupteur que tout il ne s'applique un attribut à un objet et ajoutez le contrôle à une collection, Extrait type de> Appliquer Attribute> Ajouter, comme:

1er commutateur

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 et checkbox.Y sont des propriétés d'un XML de définition et ici nous réglons le contrôle à cette taille

...

deuxième commutateur (à boucle à travers les contrôles qui sont à l'intérieur d'un composant 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; 

il est plus grand que il doit couvrir tous les objets que j'utilise ...

Comment puis-je à cela dans un appel simple? Genre comme:

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

Y at-il un moyen de simplifier cela?


Ajouté L'instruction switch

Répondre

0

Si AdwizaRepeatBox, AdwizaRepeatBox, AdwizaSlavebox et autres ne couvrent pas la classe unique qui a la propriété d'attributs que vous feriez mieux de l'espace de noms de réflexion de recherche d'une réponse ou de réécrire votre code afin qu'ils étendraient seule classe

Si elles étendent unique classe que le code que vous recherchez devrait ressembler à ceci:

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); 
} 

Modifier

Utilisez cette option si tous adwizaControl ex tendre une seule classe qui a la propriété Attributs.Si les propriétés X et Y sont étendues, utilisez le mot-clé virtual pour remplacer la déclaration de la classe de base

+0

Il serait également utile de voir l'instruction switch. –

+0

ajouté le code de démarrage du commutateur :) - dang ... Je ne serai jamais comment magique T est et fait: -/ – balexandre

+0

Est-ce que la propriété est la propriété d'attributs de AdwizaWebControl? Si c'est vrai, je ne sais pas pourquoi vous devez lancer la mise en œuvre (AdwizaLabel, AdwizalSlavebox, etc.). Vérifier la réponse modifiée pour le code –

0

Je comprends que toutes les classes AdwizaGrid, etc. AdwizaHyperlink ont AdwizaControl comme classe de base commune. Je suppose également que Attributes est défini dans la classe de base. Dans ce cas, vous pouvez supprimer une grande partie de la duplication comme ceci:

AdwizaControl control; 

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

puis après le cas: vous pourriez

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

Après cela, remplacez le grand commutateur avec une sorte de cartographie de les types de contrôle aux attributs (je ne connais pas C# donc je ne peux pas vous donner un conseil exact, mais en C++ par exemple, vous pouvez utiliser des foncteurs ou des pointeurs vers des membres).

0

Dans ce cas, vous n'avez pas besoin d'utiliser de génériques. Si tous vos contrôles héritent de AdvizaWebControl vous pourriez simplement écrire qqch comme ceci:

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); 

Toutefois, si vos classes ne héritent pas de génériques AdwizaWebControl ne va pas aider.