2011-12-28 26 views
3

我有一個類:動態觸及屬性的最佳做法?

public class ActionReportEntity 
{ 
    public string Caption { get; set; } 
    public string Description { get; set; } 
    public string Item1 { get; set; } 
    public string Item2 { get; set; } 
    public string Item3 { get; set; } 
    public string Item4 { get; set; } 
    public string Item5 { get; set; } 
    public string Item6 { get; set; } 
    public string Item7 { get; set; } 
    public string Item8 { get; set; } 
    public string Item9 { get; set; } 
    public string Item10 { get; set; } 
} 

我要填寫項目1項(1-10)動態,我實現這個代碼的特性:

Regex regex=new Regex("Item[0-9]+"); 
var props = typeof(ActionReportEntity) 
.GetProperties() 
.Where(p => regex.IsMatch(p.Name)) 
.OrderBy(p=>p.Name.Substring(4).ToInteger()); 

但我認爲這種方式是不是好的和強大的,因爲可能是任何一個重構這個類,並添加一些屬性突然像Item50或更改屬性。

我想我必須使用屬性,但我還沒有使用它。

什麼是實現動態屬性的最佳實踐?

更新:

提到我想在網格或報表綁定使用這個類,所以我不希望我的類的結構變化,因爲我無法列出道具綁定網格或在報告中使用它

回答

0

最簡單的方法是將它們存儲在一些簡單的數據結構中。

1

然後,全能程序員發明了List<>,他們來自IEnumerable家族。他還表示,「你不應該迭代硬編碼的變量名」。而且還有很多值得高興的事情:)

只要做一個public List<string> Items { get; set; }並在那裏添加你所有的字符串,這使得你的生活在任何可能的方式更容易。

+0

+1「不可遍歷硬編碼的變量名」 – 2011-12-28 12:45:19

+0

我提到我想在網格或報表綁定使用這個類,所以我不希望我的類的結構變化,因爲我無法將列表綁定綁定到網格或在報表中使用。 – 2011-12-28 12:54:22

+0

報告無法處理IEnumerable?無論哪種方式,您總是會將IEnumerable添加到您的課程中。當你需要迭代時,你可以將所有Item#變量複製到列表中,迭代列表中的數據,然後將它們複製回來(你只需要編寫一個'copy'和'put back'算法。 ,但我確實覺得無法處理IEnumerable意味着你有更大的潛在問題... – Flater 2011-12-28 13:01:33

0

我知道你已經表明你不想改變你的班級結構,但是你打算改變班​​級的內部結構而不改變公共結構嗎?如果是這樣,你可以保留屬性,只需要使用一個數組作爲後臺。你可以提供一個Update方法來通過索引來更新單個屬性或一次更新全部10個屬性。

public class ActionReportEntity 
{ 
    private String[] items = new String[10]; 

    public string Caption { get; set; } 
    public string Description { get; set; } 
    public string Item1 { get { return items[0]; } set { items[0] = value; } } 
    public string Item2 { get { return items[1]; } set { items[1] = value; } } 
    public string Item3 { get { return items[2]; } set { items[2] = value; } } 
    public string Item4 { get { return items[3]; } set { items[3] = value; } } 
    public string Item5 { get { return items[4]; } set { items[4] = value; } } 
    public string Item6 { get { return items[5]; } set { items[5] = value; } } 
    public string Item7 { get { return items[6]; } set { items[6] = value; } } 
    public string Item8 { get { return items[7]; } set { items[7] = value; } } 
    public string Item9 { get { return items[8]; } set { items[8] = value; } } 
    public string Item10 { get { return items[9]; } set { items[9] = value; } } 

    public void UpdateItem(Int32 index, String value) 
    { 
     if (index >= items.Length) 
      throw new ArgumentException(); 

     items[index] = value; 
    } 
    public void UpdateItem(params String[] values) 
    { 
     if (values.Length != items.Length) 
      throw new ArgumentException(); 

     for (int i = 0; i < values.Length; i++) 
     { 
      items[i] = values[i];     
     } 
    } 

} 
+0

感謝您的答案,但使用列表如何幫助我? – 2011-12-28 13:11:47