从PropertyInfo.GetValue创建的字典中获取值

时间:2014-03-06 02:43:28

标签: c# dictionary system.reflection

如何让它发挥作用?

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

我没有修复这一特定的指令。也许如果我能够让上面的第一阶段工作,它将告诉我如何做其他阶段。

1 个答案:

答案 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;