Delphiでクラス名からオブジェクトをデフォルトコンストラクタで生成する

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;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください