2009-09-29 85 views
4

我該如何將此代碼重構爲一種方法或某種東西?如何重構這段代碼?

  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; 

回答

7

假設你有.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

完美! - 正如我所尋找的 – CurlyFro 2009-09-29 17:05:22

+3

根據您的使用情況,有這麼多的附加,它可能會給你更好的性能,使用StringBuilder – sooniln 2009-09-29 17:09:51

+0

哦,是的,如果它在一個循環中,可能更有意義的是傳遞一個stringbuilder而不是串聯。 – 2009-09-29 17:12:57

15

要開始,重構邏輯成一個函數。

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

一個很好的下一步可能是使用反射和屬性:

編輯:充實反射的解決方案,沒有實際調試它尚未雖然。

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足夠接近,我可能會使用一個(REF的字符串src,......),而不是返回值。 – 2009-09-29 17:01:31

+0

會更快,但如果可能,我傾向於默認沒有副作用。 – 2009-09-29 17:04:18

+0

AppendItem(_gridModel.Header,item.Header); < - NullReferenceException當調用item.Header – eglasius 2009-09-29 17:07:24