2013-02-08 68 views
1

我有這樣一個字符串列表值:創建動態字符串名稱,並設置在C#

public string TypeOrig { get; set; } 
public string TypeAdj { get; set; } 
public string TypeClass { get; set; } 
public string TypeMsg { get; set; } 
public string QtyOrig { get; set; } 
public string QtyAdj { get; set; } 
public string QtyClass { get; set; } 
public string QtyMsg { get; set; } 

基於來自DB行,我填充字符串是這樣的:

switch(fRow["fieldName"].ToString()) 
{ 
    case "partType": 
     TypeOrig = fRow["original"].ToString(); 
     TypeAdj = fRow["adjusted"].ToString(); 
     TypeClass = fRow["status"].ToString(); 
     TypeMsg = fRow["message"].ToString(); 
     break; 
    case "qty": 
     QtyOrig = fRow["original"].ToString(); 
     QtyAdj = fRow["adjusted"].ToString(); 
     QtyClass = fRow["status"].ToString(); 
     QtyMsg = fRow["message"].ToString(); 
     break; 
} 

我想這個減少是這樣的:

switch(fRow["fieldName"].ToString()) 
    case "partType": fieldName = "Type"; 
     break; 
    case "qty": fieldName = "Qty"; 
     break; 
} 
fieldName + "Orig" = fRow["original"].ToString(); 
fieldName + "Adj" = fRow["adjusted"].ToString(); 
fieldName + "Class" = fRow["status"].ToString(); 
fieldName + "Msg" = fRow["message"].ToString(); 

附加信息:

  1. db中的字段名稱有一些例外,所以我不能簡單地使用字段名稱並且必須使用開關。
  2. 我還必須從db中爲幾個字段填充一些非標準字符串。
  3. 我目前有32個字段名稱,可以增長,所以減少代碼的長度將使它更容易管理。 (@Servy的方法將其降低到19)
  4. 生成的字符串在視圖中使用。

如何動態設置字符串名稱並填充它?

回答

3

你應該重構你的對象。每當你看到自己在一堆字段/屬性前面添加同樣的東西時,它通常會引發你應該創建一個新類型來表示這種類型的數據。

public class Foo //TODO give meaningful name 
{ 
    //I changed the abbreviations to real words. If I was wrong, please fix, but 
    //as a rule try to avoid overuse of abbreviations in variable names; 
    //it makes code harder to read. 
    public string Original { get; set; } 
    public string Adjacent { get; set; } 
    public string Class { get; set; } 
    public string Message{ get; set; } 
} 

現在回到你的第一個類型,我們可以有:

public class MyClass //TODO fix name 
{ 
    public Foo Type {get;set;} 
    public Foo Quality {get;set;} 
} 

現在,我們有我們可以separeate出代碼用於填充對象,並把該對象在MyClass了兩個同類型的對象:

Foo foo = new Foo() 
{ 
    Original = fRow["original"].ToString(), 
    Adjacent = fRow["adjusted"].ToString(), 
    Class = fRow["status"].ToString(), 
    Message= fRow["message"].ToString(), 
}; 

switch(fRow["fieldName"].ToString()) 
{ 
    case "partType": 
     Type = foo; 
     break; 
    case "qty": 
     Quality = foo; 
     break; 
} 
+0

清潔,簡單,易於閱讀和維護。簡單的美麗!感謝您的提示和提示。 – davids 2013-02-09 01:22:10

+0

更進一步,大部分模型字符串與db字段名稱相同。如果我針對每種特殊情況使用一個案例,我如何在默認開關案例中使用db字段名稱?所以'case「qty」:qty = foo;'只是'default [dbfield] = foo;'。那可能嗎? – davids 2013-02-09 01:33:20

+0

@davids所以處理這個問題的方法是使用'Dictionary '而不是幾個屬性,然後代替switch/cast,你只需要'somedictionary [fRow [「fieldName」]。ToString()] = foo; '你就完成了。 – Servy 2013-02-09 05:50:34

0

似乎爲Dictionary<string, string>

一個良好的使用情況下,例如

Dictionary<string, string> fieldValues = new Dictionary<string, string>(); 
fieldValues.Add("TypeOrig", string.Empty); 
fieldValues.Add("TypeAdj", string.Empty); 
fieldValues.Add("TypeClass", string.Empty); 
fieldValues.Add("TypeMsg", string.Empty); 
fieldValues.Add("QtyOrig", string.Empty); 
fieldValues.Add("QtyAdj", string.Empty); 
fieldValues.Add("QtyClass", string.Empty); 
fieldValues.Add("QtyMsg", string.Empty); 

.... 

switch(fRow["fieldName"].ToString()) 
{ 
    case "partType": fieldName = "Type"; 
     break; 
    case "qty": fieldName = "Qty"; 
     break; 
    default: fieldName = string.Empty; 
     break; 
} 
if(fieldName.Length > 0) 
{ 
    fieldValues[fieldName + "Orig"] = fRow["original"].ToString(); 
    fieldValues[fieldName + "Adj"] = fRow["adjusted"].ToString(); 
    fieldValues[fieldName + "Class"] = fRow["status"].ToString(); 
    fieldValues[fieldName + "Msg"] = fRow["message"].ToString(); 
} 

當然,這種變化需要直接使用字符串變量的代碼重寫,但它有許多優點。只有一個變量,具有新密鑰的可擴展性,更多面向對象,適用於字典的許多功能,以及Linq的可擴展性......

+0

我從來沒有想到這一點。我添加了另一個要求:字符串在'Model.TypeAdj'視圖中使用。我如何使用字典值來做到這一點? – davids 2013-02-08 23:31:32

+0

抱歉,MVC並不是我的專長,我想可以用相同的方式使用字典值,但如果您發現某些內容需要添加到答案中,可以隨意編輯。 – Steve 2013-02-08 23:42:28

+0

@davids如果您使用的是HtmlHelpers,則無法使用字典解決方案,例如'@ H​​tml.EditorFor(m => m.TypeAdj)'。 – 2013-02-08 23:48:38

0

使用字典作爲屬性的後備存儲。