2011-04-19 51 views
0

我有一個C#類,得到加載一個數據庫行(orm)..這個對象有它的所有數據..我需要一種方法來遍歷類級別的成員尋找特定的條件?以下是我所擁有的差距和應該有更好的解決方案.. 是反思的答案和如何?謝謝!C#遍歷類成員來尋找一個特定的條件

public string findCURRRATEValue() 
{ 
    if (!FUNDNO1.Equals("999") && 
     FUNDTYPE1.Equals("F")) 
    { 
     return "CURRRATE1" + "#" + CURRRATE1; 
    } 
    else if (!FUNDNO2.Equals("999") && 
     FUNDTYPE2.Equals("F")) 
    { 
     return "CURRRATE2" + "#" + CURRRATE2; 
    } 


------------ 
------------- 

    else if (!FUNDNO59.Equals("999") && 
     FUNDTYPE59.Equals("F")) 
    { 
     return "CURRRATE59" + "#" + CURRRATE59; 
    } 
    else if (!FUNDNO60.Equals("999") && 
     FUNDTYPE60.Equals("F")) 
    { 
     return "CURRRATE60" + "#" + CURRRATE60; 
    } 
    else 
    { 
     return "CURRRATEX"; 
    } 
} 
+2

有人可能會開始規範化您的數據庫,並給你的領域更具體的數據類型。 – Reddog 2011-04-19 18:16:20

+2

我認爲你的問題與建模有關,而不是如何檢索一個值。爲什麼你需要60個領域的現行利率和60個領域的基金類型?我寧願有一個單獨的表來保存每個基金的當前利率...... – 2011-04-19 18:17:23

+2

這不是使用關係數據庫的方式。您應該將所有這些數據存儲在行中而不是列中。 – 2011-04-19 18:19:48

回答

2

在reflction方面說,這是你可以做什麼:

var type = this.GetType(); 
var fundNoProperties = type.GetProperties() 
    .Where(p => p.Name.StartsWith("FUNDNO")); 
foreach (var info in fundNoProperties) 
{ 
    string orderNumber = info.Name.Replace("FUNDNO", ""); 
    var fundTypeInfo = type.GetProperty("FUNDTYPE" + orderNumber); 
    if (info.GetValue(this, null).ToString() == "999" && 
     fundTypeInfo.GetValue(this, null).ToString() == "F") 
    { 
     var currRate = type.GetProperty("CURRATE" + orderNumber); 
     return currRate.Name + currRate.GetValue(this, null).ToString(); 
    } 
} 

當然,我有一個人評論這不是您設計數據庫同意。但是,數據挖掘表可能看起來像這樣(100列以上,任何人?),或者可能是舊的傳統系統表(我們無法控制它)。骯髒的技巧並不是那麼可怕的解決方案。

0

是的,你應該能夠通過反射來解決這個問題。僞出我的頭應該表現出的想法,但可能不會編譯開箱:

foreach (PropertyInfo prop in this.GetType().GetProperties()) 
{ 
    object val = prop.GetValue(this,new object[0]); 
    if (...your condition ...) return "xyz" + value; 
} 
return "last else case"; 
1

正如其他人說,這是與數據庫設計的方式有問題。最好的解決方案是創建一個單獨的表格,其中包含每個基金的當前利率(按照@Paulo Santos)。但是,如果你堅持使用這個解決方案(就像我們許多人一樣),你可以使用反射,但反射速度很慢(請參閱@Achim的解決方案)。您也可以將每個變量放入一個Dictionary中,並通過Dictionary訪問速率。這樣,您不必重複邏輯,但是如果您需要添加字段,則需要將其添加到字典中。

另一種方法是採用DDD方法並將DTO與實體/值對象隔離。保留這些對象並像使用DTO而不是業務對象一樣使用它們。然後使用Rate屬性創建一個Fund對象,並將DTO對象映射到業務對象。最終,這將是向更好的數據結構過渡的開始 - 從C#級開始。