Переходя от этого вопроса: Установка свойства "nullable" для объекта. NET
Спасибо Оливье за его помощь. Сейчас я использую этот импорт для библиотеки типов. NET: https://github.com/DelphiWorlds/MiscStuff/blob/master/Test/mscorlib_TLB.pas, основанной на версии 4 CLR, в отличие от устаревшей версии, которую я использовал.
. .и теперь у меня есть этот код:
procedure TDotNetObject.SetEnumProperty(const APropertyName: string; const AValue: OleVariant; const ATypeName: string; const AIndex: Integer = -1);
var
LRes: HRESULT;
LEnumType, LPropertyType: _Type;
LInvokeFlags: TOleEnum;
LArgs: PSafeArray;
LConvertedValue: OleVariant;
LPropertyInfo: _PropertyInfo;
LIndex: PSafeArray;
LName: WideString;
LResHex: string;
begin
LPropertyType := nil;
LRes := FType.GetProperty(APropertyName, BindingFlags_Instance or BindingFlags_Public or BindingFlags_NonPublic, LPropertyInfo);
if Succeeded(LRes) then
begin
if ATypeName.IsEmpty then
LPropertyInfo.GetType(LPropertyType)
else
LPropertyType := MTDataClr.GetType(ATypeName); // This is a workaround since for obtaining the underlying type
end;
if LPropertyType <> nil then
begin
// Convert the value to the correct type
LEnumType := MTDataClr.GetCoreType('System.Enum');
LInvokeFlags := BindingFlags_InvokeMethod or BindingFlags_Public or BindingFlags_Static;
LArgs := VariantToPSafeArray(VarArrayOf([LPropertyType, AValue]));
if Succeeded(LEnumType.InvokeMember_2('ToObject', LInvokeFlags, nil, Null, LArgs, nil, LConvertedValue)) then
begin
if AIndex >= 0 then
LIndex := VariantToPSafeArray(VarArrayOf([AIndex]))
else
LIndex := nil;
LRes := LPropertyInfo.SetValue(FTarget, LConvertedValue, LIndex);
if not Succeeded(LRes) then
begin
LResHex := IntToHex(LRes);
Sleep(0);
end;
end;
end;
end;
Все работает до SetValue. LResHex - это «80070057», что, по-видимому, равнозначно ERROR_INVALID_PARAMETER.
Есть какие-нибудь подсказки относительно того, где я ошибся?