Получение значений свойств класса с помощью GetFieldProps
Я пытаюсь получить значения полей в классе, используя GetFieldProps
Изначально я пользуюсь GetClassLayout
чтобы получить массив токенов FieldDef, а затем перечислить их, используя 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
);
}
1 ответ
GetFieldProps
предоставляет только статическую информацию, поэтому pValue
& pcchValue
вероятно, относятся только к полям, представляющим константы.
Чтобы получить действительное значение из экземпляра, я считаю, что вам нужно использовать COR_FIELD_OFFSET.ulOffset
вернулся GetClassLayout
чтобы получить место в памяти относительно ObjectID (ObjectID является указателем на фактический экземпляр), и вы можете получить требуемый размер / интерпретацию, анализируя подпись, которая GetFieldProps
магазины в ppvSigBlob
а также pcbSigBlob
(формат которого определен в разделе 23.2.4 раздела II стандарта ECMA-335).
- Если тип является примитивным типом значения, то размер и интерпретация должны быть очевидными (например, Int32 будет 4-байтовым целым числом).
- Если тип является ссылочным типом, то это будет собственное поле размера int, содержащее ObjectID.
- Если тип является перечислением, то он будет иметь размер своего базового типа (раздел 14.3 раздела II ECMA-335).
- Если тип не является примитивным типом, то вы можете использовать
GetClassLayout
чтобы найти расположение его компонентных полей. - Вы можете получить дальнейшую разбивку строк и массивов, используя
GetStringLayout
а такжеGetArrayObjectInfo
С уважением.