获取枚举大小和名称作为泛型参数传递

3
看一下以下的代码:
uses
  TypInfo, Dialogs, Classes, Generics.Collections, ADODB, DB, SysUtils;

type
  TTable_1 = (ID, FName, LName, FatherName);

type
  TBaseTable<TableType> = class(TADOQuery)
  public
    constructor Create(AOwner: TComponent); Override;
    procedure Select(DS: TDataSource);
  end;

implementation

{ TBaseTable<TableType> }

constructor TBaseTable<TableType>.Create(AOwner: TComponent);
begin
  inherited;
  Self.Connection := DataModule3.ADOConnection1;
  Self.Connection.Connected := True;
end;

procedure TBaseTable<TableType>.Select(DS: TDataSource);
var
  Query: string;
  EnumIndex: Byte;
begin
  EnumIndex := 0;
  Query := 'SELECT ';
  while (GetEnumName(TypeInfo(TableType), EnumIndex) <> UnitName) do
  begin
    Query := Query + GetEnumName(TypeInfo(TableType), EnumIndex) + ',';
    Inc(EnumIndex);
  end;
  Query := Copy(Query, 0, Length(Query) - 1);
  Query := Query + ' FROM Table_1';
  Close;
  SQL.Text := Query;
  Open;
  DS.DataSet := Self;
end;

我这样使用它:
var
  Test: TBaseTable<TTable_1>;
begin
  Test := TBaseTable<TTable_1>.Create(Self);
  Test.Select(DataSource1);
end;

如您所见,我在查询中将表名写成静态字符串('Table_1'),我想获取枚举名称并将其作为表名传递给选择语句,以使代码更易用。
另一个问题是如何获取传递的枚举大小以获取字段名称。如您所见,我目前将当前枚举名称与单位名称进行比较,这是不好的想法,有人可以帮助我吗?
至少我想开发一个类,在我的数据库中为每个表编写一个枚举,并将其传递给我的类,我的类的方法使用它来选择、插入、编辑等操作。
我想为自己编写一个微型ORM。
谢谢。
1个回答

6

您可以使用新的System.RTTI单元:

function TBaseTable<TableType>.Select: string;
var
  EnumIndex: Byte;
  Context: TRttiContext;
  TableTypeRtti: TRttiEnumerationType;
begin
  Context := TRttiContext.Create;
  try
    TableTypeRtti := Context.GetType(TypeInfo(TableType)) as TRttiEnumerationType;
    Result := 'SELECT ';
    for EnumIndex := TableTypeRtti.MinValue to TableTypeRtti.MaxValue do begin
      Result := Result + GetEnumName(TypeInfo(TableType), EnumIndex) + ',';
    end;
    Result := Copy(Result, 0, Length(Result) - 1);
    Result := Result + ' FROM ' + TableTypeRtti.Name;
  finally
    Context.Free;
  end;
end;

1
+1。但遗憾的是,TRttiEnumerationType.GetName<T>尚未公开 (: http://qc.embarcadero.com/wc/qcmain.aspx?d=90339)。 - Jeroen Wiert Pluimers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接