2014-03-06 62 views
1

如何讓此功能起作用?從PropertyInfo.GetValue創建的詞典中獲取價值

GSD用於存儲SQL表的緩存映像的類。 GSD有幾個公共靜態屬性,代表不同的「CacheTables」,它們是Dictionary = long,rowtypeclass = objects,每個對象都有不同的rowtype類。 rowtype類對象建模SQL錶行。

public class GSDataObject 
{ 
    private Dictionary<long, GRPListRow> prvGRPList; 
    private Dictionary<long, TestTableRow> prvTestTable; 
    //======================================= 
    public Dictionary<long, GRPListRow> GRPList 
    { 
     get { return prvGRPList;} 
     set { prvGRPList = value; } 
    } 

    //===================================== 
    public Dictionary<long, TestTableRow> TestTable 
    { 
     get { return prvTestTable; } 
     set { prvTestTable = value; } 
    } 


public class TestTableRow{ 

     public int ID { get; set; } 
     public string Field1 { get; set; } 
     public string Field2 { get; set; } 
     public string Field3 { get; set; } 
     public string Field4 { get; set; } 
     public string Field5 { get; set; } 
     public string Field6 { get; set; } 
     public string Field7 { get; set; } 
     public string Field8 { get; set; } 
} 

GSD及其不同的CacheTable屬性在聲明爲硬編碼時工作正常;我想用反射來訪問它們。

具體而言,我想從GSD實例中的特定CacheTable中獲取特定的行,更新該行,然後將其放回。以下說明介紹了「獲取行」階段。

前三條指令正常工作,生成的wrkCacheTableObject的類型正確Dictionary = long,wrkRowtype =。但是,wrkCacheTableObject沒有編入索引,所以我無法從中檢索行。

wrkGSD是一個類GSD的實例化。 wrkCacheTableName是特定CacheTable屬性的字符串名稱。 wrkRowType是行類型的字符串類名稱。

wrkRow = Activator.CreateInstance(wrkRowType); 
PropertyInfo wrkTablePropInfo = wrkGSDOType.GetProperty(wrkCacheTableName); 

object wrkCacheTableObject = wrkTablePropInfo.GetValue(wrkGSD, null); // <== gives correct CacheTable instance 
wrkTableDictObject = (Dictionary<long, object>)wrkCacheTableObject; //<=== fails here 

wrkRow = wrkTableDictObject[wrkRowID]; 

// update wrkRow fields using reflection //<== this works if I retrieve wrkRow via hard code 
// put it back into wrkTableDictObject 
// put wrkTableDictObject back into wrkGSD 

我不是固定在這個特定的指令集上。也許如果我可以讓上面的第一階段工作,它會告訴我如何做其他階段。

回答

1

發現通過專家交流了答案:

dynamic wrkCacheTableObject = wrkTablePropInfo.GetValue(wrkGSD, null); 
//--- get the row using dynamic 
dynamic wrkRow = wrkCacheTableObject[(long)varAJR.rowID]; 
//--- put the row back 
wrkCacheTableObject[(long)varAJR.rowID]= wrkRow;