如何让它发挥作用?
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获取特定的Row,更新该行,然后将其放回。以下说明描述了“获取行”阶段。
前三个指令有效,生成的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
我没有修复这一特定的指令。也许如果我能够让上面的第一阶段工作,它将告诉我如何做其他阶段。
答案 0 :(得分:2)
通过专家交流找到答案:
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;