2014-03-05 127 views
0

基本上,我有一個系統,我的datagrid標記已經改變了新的背景顏色的單元格,爲此我在包含這些屬性的對象中有一個方法它接收一個字符串,它是要檢查的屬性的名稱,然後是一個switch語句,它接受該字符串以檢查正確的屬性。替換switch語句 - 通過字符串名稱獲取屬性

public Color HasChanged(string value) 
{ 
    switch (value) 
    { 
     case "CILRef": 
      if (_localShipment.cilRef != _originalShipment.cilRef) 
      { 
       return Colors.SkyBlue; 
      } 
      else 
      { 
       return Colors.White; 
      } 
     case "ArrivedAtPortDate": 
      if (_localShipment.arrivedAtPortDate != _originalShipment.arrivedAtPortDate) 
      { 
       return Colors.SkyBlue; 
      } 
      else 
      { 
       return Colors.White; 
      } 
    } 
} 

爲了簡潔起見,我已經刪除了其餘的屬性。

現在我得到的嘮叨的感覺,有一個更乾淨的方式來做這個字符串>財產沒有使用switch語句,但我不能爲我的生活在谷歌上找到任何東西,很難搜索沒有一些關鍵字繼續。

我也試圖只保存那些已經改變的屬性,我打算將任何已更改的屬性名稱放入數組中,然後用另一個switch語句檢查該數組,然後保存正確的屬性。然而這又對我來說是不整潔的。

是否有更清晰的解決方案,希望能夠處理新屬性的添加,而無需向switch語句添加新代碼。

如果需要,我可以包含執行此檢查的其餘代碼(即數據網格上的WPF綁定,以及調用帶有屬性名稱的檢查方法作爲字符串參數的轉換器)。

+0

@詹姆斯 - 在OP:「我已經刪除屬性爲休息簡潔。「 –

回答

6

您可以編寫一個擴展方法:

public static object GetPropValue(this object o, string propName) 
{ 
    return o.GetType().GetProperty(propName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase) 
      .GetValue(o); 
} 

,並用它

if(localShipment.GetPropValue(value).Equals(originalShipment.GetPropValue(value))) 
{ 
} 
+0

啊這是我正在尋找的東西對於!我必須試試這個。 – Ben

+0

我在上面的代碼中發現錯誤,「方法'GetValue'沒有超載需要1個參數」 – Ben

+0

@ user1412240嘗試'.GetValue(o,null); '你必須使用.Net – EZI

2

你可以定義一個通用的接口,你的屬性,然後創建屬性的字典,像這樣:

var properties = new Dictionary<string, IProperty>(); 

和訪問他們像這樣:

properties["CILRef"] 
+0

這是一個不錯的主意,它肯定有助於解決如果屬性被添加到這個模型中,不得不繼續添加代碼的第二個問題,我將對此發揮作用 – Ben

2

我會說switch聲明不過,您可以使用condition operator

switch (value) 
{ 
    case "CILRef": 
     return _localShipment.cilRef != _originalShipment.cilRef ? Colors.SkyBlue : Colors.White; 
    case "ArrivedAtPortDate": 
     return _localShipment.arrivatedAtPortDate != _originalShipment.arrivedAtPortDate ? Colors.SkyBlue : Colors.White; 
    ... 
} 
單行顯示

但你仍然有重複的代碼在這裏,你可以一步藉此,有一個GetColor方法,它使用一個函數在

public Colors GetColor(Func<bool> condition) 
{ 
    return condition() ? Colors.SkyBlue : Colors.White; 
} 
... 
switch (value) 
{ 
    case "CILRef": 
     return GetColor(() => _localShipment.cilRef != _originalShipment.cilRef); 
    case "ArrivedAtPortDate": 
     return GetColor(() => _localShipment.arrivatedAtPortDate != _originalShipment.arrivedAtPortDate); 
} 

你的代碼更仔細地觀察,它似乎你是各航運比較相同的屬性,你可以使用這個反射

public Color HasChanged(string value) 
{ 
    var date1 = _localShipment.GetType() 
     .GetProperty(value) 
     .GetValue(_localShipment, null); 
    var date2 = _originalShipment.GetType() 
     .GetProperty(value) 
     .GetValue(_originalShipment, null); 
    return date1 != date2 ? Colors.SkyBlue : Colors.White; 
} 

爲了簡潔字面上減少到一個檢查,你可以創建一個擴展方法的收官反射部

public static T Get<T>(this object obj, string name) 
{ 
    return obj.GetType().GetProperty(name).GetValue(obj, null); 
} 
... 
return _localShipment.Get<DateTime>(value) != _originalShipment.Get<DateTime>(value) ? Colors.SkyBlue : Colors.White;