Установка свойства Enum для объекта. NET - PullRequest
2 голосов
/ 30 апреля 2020

Переходя от этого вопроса: Установка свойства "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.

Есть какие-нибудь подсказки относительно того, где я ошибся?

...