0

我有一个布尔字段,我想使用MyField.SetValue(Self, MyValue). 无论我尝试什么,我都会不断收到类型转换错误。

问题是 MyValue 总是包含一个序数并且不被识别为包含一个布尔值。我知道布尔值是一个枚举,它是一个序数,但仍然可以使用 TValue 设置布尔字段和属性。

MyValue.IsOrdinal = True我尝试了以下方法来启动 MyValue但每次都MyValue.IsBoolean = False

  1. MyValue := TValue.From(True);
  2. MyValue := TValue.From<Boolean>(True);
  3. MyBool := True; MyValue := MyValue.From(MyBool);
  4. MyBool := True; MyValue := MyValue.From<Boolean>(MyBool);
  5. MyValue := True;
  6. MyBool := True; MyValue := MyBool;
  7. MyBool := True; TValue.Make(@MyBool, TypeInfo(Boolean), MyValue);

有没有办法让 TValue 接受它包含一个布尔型 iso 序数以便MyField.SetValue(Self, MyValue)成功?

提前致谢,

德科拉曼

4

1 回答 1

3

TValue适用于布尔值。

检查此示例代码

{$APPTYPE CONSOLE}

uses
  Rtti,
  SysUtils;

Type
  TAnyClass=class
   AField : Boolean;
  end;

Var
 Ctx       : TRttiContext;
 MyValue   : TValue;
 A         : TAnyClass;
 MyField   : TRttiField;
begin
  try
    Ctx:=TRttiContext.Create;
    A:=TAnyClass.Create;
    try
      MyField:=Ctx.GetType(TAnyClass).GetField('AField');

      MyValue:= MyValue.From(False);
      MyField.SetValue(A, MyValue);
      Writeln('The Value of AField Is '+BoolToStr(A.AField, True));

      MyValue:= MyValue.From(True);
      MyField.SetValue(A, MyValue);
      Writeln('The Value of AField Is '+BoolToStr(A.AField, True));
    finally
      A.Free;
      Ctx.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
于 2012-05-08T16:02:03.627 回答