2012-10-10 93 views
1

我有一組自定義類屬性 - 每個屬性的命名與數據庫中的值相同。我想要做的是根據交換機動態設置每個屬性的值。自定義類屬性 - 動態參考

自定義屬性是這個樣子:

class MyDEF 
{ 

    #region Variable Declaration Section.... 

    private string _ABC01; 
    private string _ABC02; 
    private string _ABC03; 
    private string _ABC04; 

    #endregion 

    #region Property Declaration Section 

    public string ABC01 
    { 
     get { return _ABC01; } 
     set { _ABC01= value; } 
    } 

    public string ABC02 
    { 
     get { return _ABC02; } 
     set { _ABC02= value; } 
    } 

    public string ABC03 
    { 
     get { return _ABC03; } 
     set { _ABC03= value; } 
    } 

    public string ABC04 
    { 
     get { return _ABC04; } 
     set { _ABC04= value; } 
    } 

    #endregion 
} 

然後在數值的代碼加載看起來像:

foreach (DataRow dr in dataTable.Rows) 
      { 
       ED = dr["FieldDesc"].ToString(); 

    switch (ED) 
    { 
          case "ABC01": 
           ratesVO.ABC01 = dr["DefaultValue"].ToString(); 
           break; 
          case "ABC02": 
           ratesVO.ABC02 = dr["DefaultValue"].ToString(); 
           break; 
          case "ABC03": 
           ratesVO.ABC03 = dr["DefaultValue"].ToString(); 
           break; 
          case "ABC04": 
           ratesVO.ABC04 = dr["DefaultValue"].ToString(); 
           break; 
    } 
    } 

我想實現的是一樣的東西:

foreach (DataRow dr in dataTable.Rows) 
    { 
       ED = dr["FieldDesc"].ToString(); 
       MyCustomProperty.ED = dr["DefaultValue"].ToString(); 
    } 

這可能嗎?如果是這樣,請提供一個例子或參考。

回答

1

您可以使用Reflection動態地根據屬性名設置值:

foreach (DataRow dr in dataTable.Rows) 
{ 
    ED = dr["FieldDesc"].ToString(); 
    ratesVO.GetType().GetProperty(ED) 
        .SetValue(ratesVO, dr["DefaultValue"].ToString()); 
} 
+0

heh;我正要說「PropertyInfo.SetValue需要第三個參數」,但看起來他們最終添加了一個「SetValue(obj,value)」重載(在.NET 4.5中)! –

+0

@MarcGravell:是的,正確 –

+0

也許我沒有正確地宣佈ratesVO。因爲當我輸入ratesVO。我看到的只是屬性。我沒有看到GetType方法或任何其他方法。 – Darkman

0

你可以做的是,在這樣的數據表中進行選擇。 (這是不是一個完美的代碼,不過,你可能需要完善它。)

DataRow[] result = table.Select("FieldDesc='<Required property>'"); 
     return result[0]["DefaultValue"] 
1

你所談論的主要是反射,其中(簡體):

string propertyName = (string)dr["FieldDesc"]; 
object value = dr["DefaultValue"]; 
// assign 
obj.GetType().GetProperty(propertyName).SetValue(obj, value, null); 

然而,反射具有性能的影響;可以謹慎使用,但作爲數據訪問循環的一部分,這可能會傷害到你;你可以考慮使用庫的支持,如FastMember提高這個顯著的表現:

var wrapped = ObjectWrapper.Create(obj); 
... 
wrapped[propertyName] = value; 

我會的,不過,說有什麼價值的東西裝到一個DataTable只是將它們推入一個對象模型。你也可以直接從數據讀取器API中工作。

+0

謝謝 - 此代碼僅用於謹慎(可能每月一次或兩次)。 – Darkman