我想實作 List 型別屬性的 Add 方法。但我得到“無效的型別別轉換”錯誤。有沒有人對此有任何想法。
公司.pas
TEmployes = class
private
FLastName: String;
FFirstName: String;
public
property FirstName: String
read FFirstName write FFirstName;
property LastName: String
read FLastName write FLastName;
end;
TContext = class
private
FEmployess: TList<TEmployes>;
public
constructor Create;
destructor Destroy; override;
property Employess: TList<TEmployes>
read FEmployess write FEmployess;
end;
專案1.pas
var Context: TContext := TContext.Create;
var rContext: TRttiContext := TRttiContext.Create;
var rIns : TRttiInstanceType :=
rContext.GetType(Context.ClassInfo) as TRttiInstanceType;
for var prop in rIns.GetProperties do
begin
var method: TRttiMethod := prop.PropertyType.GetMethod('Add');
var emp: TEmployes := TEmployes.Create;
emp.FirstName := 'Username';
method.Invoke(prop.ClassInfo, [emp]);
end;
Context.Free;
uj5u.com熱心網友回復:
您沒有指出哪一行代碼引發了錯誤。
但是,您使用 RTTI 訪問和呼叫該TList<T>.Add()方法的方式絕對是錯誤的。您基本上是在呼叫 RTTI 來執行以下等效操作:
for (<Every Property in TContext>) do
begin
var emp: TEmployes := TEmployes.Create;
emp.FirstName := 'Username';
TList<TEmployes>(TRttiProperty.ClassInfo).Add(emp);
end;
您真正需要呼叫的是等效于以下內容:
var Context: TContext := TContext.Create;
for (However Many Employees you need) do
begin
var emp: TEmployes := TEmployes.Create;
emp.FirstName := 'Username';
Context.Employess.Add(emp);
end;
Context.Free;
這意味著您需要實際讀取物件的Employess屬性Context以獲取其TList物件,然后您可以呼叫Add()該TList物件,例如:
var Context: TContext := TContext.Create;
var rContext: TRttiContext := TRttiContext.Create;
var rIns : TRttiType := rContext.GetType(Context.ClassInfo);
var prop : TRttiProperty := rIns.GetProperty('Employess');
var method: TRttiMethod := prop.PropertyType.GetMethod('Add');
var list : TObject := prop.GetValue(Context).AsObject;
for (However Many Employees you need) do
begin
var emp: TEmployes := TEmployes.Create;
emp.FirstName := 'Username';
method.Invoke(list, [emp]);
end;
Context.Free;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/493565.html
