Delphiでクラス名からオブジェクトをデフォルトコンストラクタで生成する
/// <summary>
/// クラス名からオブジェクトをデフォルトコンストラクタで生成する。
/// 引数をとらないコンストラクタがないときはnilを返す。
/// </summary>
/// <param name="ClassName">
/// クラス名
/// </param>
function CreateObject(ClassName: string): TObject;
var
Context: TRttiContext;
RttiType: TRttiType;
RttiMethod: TRttiMethod;
AClass: TClass;
begin
// クラス名から型を表すRTTIクラスを取得する
RttiType := Context.FindType(ClassName);
// メソッドを走査する
for RttiMethod in RttiType.GetMethods do
begin
// パラメータのないコンストラクタを探す
if RttiMethod.IsConstructor and (Length(RttiMethod.GetParameters) = 0) then
begin
// クラス参照を取得する
AClass := RttiType.AsInstance.MetaclassType;
// コンストラクタを実行してオブジェクトを生成する
Exit(RttiMethod.Invoke(AClass, []).AsObject);
end;
end;
// 引数をとらないコンストラクタが見つからなかった
Exit(nil);
end;
使用例
var
Obj: TObject;
SL: TStringList;
begin
SL := CreateObject('System.Classes.TStringList') as TStringList;