获取枚举大小和名称作为通用参数传递

时间:2012-11-12 12:02:47

标签: delphi generics orm enums

查看以下代码:

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'),我想获取枚举名称并将其作为表名传递给select语句,以使代码更有用。< / p>

另一个问题是如何获取传递的枚举大小来获取字段名称,因为您可以看到我目前将当前枚举名称与单位名称进行比较,这是个坏主意,任何人都可以帮助我吗?

至少我想开发一个类,为我的数据库中的每个表写一个Enum并将它传递给我的类,我的类的方法用它来选择,插入,编辑等。

我想写一个微型ORM供我个人使用。

感谢。

1 个答案:

答案 0 :(得分: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;