2009-09-29 11 views
4

comment puis-je refactoriser ce code en une méthode ou quelque chose?Comment refactoriser ce code?

  if (!string.IsNullOrEmpty(_gridModel.Header)) 
       _gridModel.Header += ","; 
      if (item != null) 
       _gridModel.Header += item.Header; 

      if (!string.IsNullOrEmpty(_gridModel.Width)) 
       _gridModel.Width += ","; 
      if (item != null) 
       _gridModel.Width += item.Width; 

      if (!string.IsNullOrEmpty(_gridModel.Align)) 
       _gridModel.Align += ","; 
      if (item != null) 
       _gridModel.Align += item.Align; 

      if (!string.IsNullOrEmpty(_gridModel.Filter)) 
       _gridModel.Filter += ","; 
      if (item != null) 
       _gridModel.Filter += item.Filter; 

      if (!string.IsNullOrEmpty(_gridModel.Type)) 
       _gridModel.Type += ","; 
      if (item != null) 
       _gridModel.Type += item.Type; 

      if (!string.IsNullOrEmpty(_gridModel.Sort)) 
       _gridModel.Sort += ","; 
      if (item != null) 
       _gridModel.Sort += item.Sort; 

Répondre

7

En supposant que vous avez .NET 3.5:

string Filter(string input, SomeType item, Func<SomeType, string> extract) 
{ 
    if (!String.IsNullOrEmpty(input)) 
    { 
     if (item == null) return ","; 
     else return "," + extract(item); 
    } 
} 

_gridModel.Header += Filter(_gridModel.Header, item, i => i.Header); 
_gridModel.Width += Filter(_gridModel.Width, item, i => i.Width); 
_gridModel.Align += Filter(_gridModel.Align, item, i => i.Align); 

// etc... 
+0

parfait! - exactement ce que je cherche – CurlyFro

+3

En fonction de votre utilisation, avec autant d'ajouts, cela peut vous donner de meilleures performances à utiliser StringBuilder – sooniln

+0

Oh oui, si c'est dans une boucle, il serait plus logique de passer un stringbuilder au lieu de concaténer. –

15

Pour commencer, refactor la logique en fonction.

_gridModel.Header = AppendItem(_gridModel.Header, item == null ? null : item.Header); 
_gridModel.Width = AppendItem(_gridModel.Width, item == null ? null : item.Width); 
... 
... 

string AppendItem(string src, string item) 
{ 
if (! string.IsNullOrEmpty(src)) 
    src += ","; 
if (! string.IsNullOrEmpty(item)) 
    src += item; 
return src; 
} 

Une bonne étape suivante pourrait consister à utiliser réflexion et propriétés:

Edit: étoffées solution de réflexion, n'ont pas encore fait débogué bien.

AppendProperties(_gridModel, item, "Header", "Width", "Align", ...) 

void AppendProperty(object gridmodel, object item, params string[] propNames) 
{ 
    foreach (string propName in propNames) 
     AppendProperties(gridmodel, item, propName); 
} 

void AppendProperties(object gridmodel, object item, string propName) 
{ 
    PropertyInfo piGrid = gridmodel.GetType().GetProperty(propName); 
    if (piGrid != null && piGrid.PropertyType == typeof(string)) 
    { 
     piGrid.SetValue(gridmodel, 
      piGrid.GetValue(gridmodel, null).ToString() + ",", null); 
    } 

    if (item == null) return; 
    PropertyInfo piItem = item.GetType().GetProperty(propName); 
    if (piItem != null) 
    { 
     piGrid.SetValue(gridmodel, 
      piGrid.GetValue(gridmodel, null).ToString() 
      + piItem.GetValue(item, null).ToString(), 
      null); 
    } 
} 
+0

+1 assez proche, je pourrais utiliser un (ref string Src, ...) et ne pas retourner la valeur. –

+0

Serait plus rapide, mais j'ai tendance à ne pas avoir d'effets secondaires par défaut lorsque cela est possible. –

+0

AppendItem (_gridModel.Header, item.Header); <- NullReferenceException lors de l'appel de item.Header – eglasius

Questions connexes