我正在尝试使用 GetFieldProps 获取类中字段的值
最初我使用 GetClassLayout
获取 FieldDef token 数组,然后使用 GetFieldProps
枚举它们。
每个 GetFieldProps
调用的结果返回 S_OK
并且确实填充szField
中的字段名称。
我在 ExceptionThrown
回调中调用此尝试,当针对异常尝试此操作时,它返回 _className
、_message
的字段名称等等,但是 ppValue
始终为空,pcchValue
也是如此。
如何获取类中字段的值?
这是我当前方法的示例(删除了声明等):
COR_FIELD_OFFSET* fieldTokensAndOffsets = new COR_FIELD_OFFSET[fieldArraySize];
m_info->GetClassLayout(
classId,
fieldTokensAndOffsets,
fieldArraySize,
&a,
&b);
for (int i = 0; i < fieldArraySize - 1; i++) {
auto rid = fieldTokensAndOffsets[i].ridOfField;
MetaDataImport->GetFieldProps(
rid,
&mb,
fieldName,
100,,
&pchField,
&pdwAttr,
&ppvSigBlob,
&pcbSigBlob,
&pdwCPlusTypeFlag,
&pValue,
&pcchValue
);
}
最佳答案
GetFieldProps
仅提供静态信息,因此 pValue
和 pcchValue
可能仅与表示常量的字段相关。
要从实例中获取实际值,我相信您需要使用 GetClassLayout
返回的 COR_FIELD_OFFSET.ulOffset
来获取相对于 ObjectID 的内存位置(ObjectID是指向实际实例的指针),您可以通过解析 GetFieldProps
存储在 ppvSigBlob
和 pcbSigBlob
中的签名来获得所需的大小/解释(其格式在 ECMA-335 Part II Section 23.2.4 中定义。
- 如果类型是原始值类型,那么大小和解释应该是不言自明的(例如,Int32 将是一个 4 字节整数)。
- 如果类型是引用类型,则它将是包含 ObjectID 的原生 int 大小的字段。
- 如果类型是枚举,则它将具有其基础类型的大小(ECMA-335 Part II 第 14.3 节)。
- 如果类型是非原始类型,则可以使用
GetClassLayout
找到它的组件字段的位置。 - 您可以使用
GetStringLayout
和GetArrayObjectInfo
进一步分解字符串和数组。
关于c++ - 使用 GetFieldProps 获取类的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48743210/