如何讓此功能起作用?從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
我不是固定在這個特定的指令集上。也許如果我可以讓上面的第一階段工作,它會告訴我如何做其他階段。