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

标签 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 语句以使代码更可用。

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

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

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

谢谢。

最佳答案

您可以使用新的 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;

关于delphi - 获取作为通用参数传递的枚举大小和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343363/

相关文章:

delphi - 使用 DWScript 创建宏

sql - FireDac添加下划线1以区分具有相同名称的2个列名称

Java 泛型与函数类型

c# - 检测泛型参数的 MaxValue

c# - 在使用 NHibernate 进行持久化的项目中测试数据模型

java - Hibernate:如何维护插入顺序

delphi - 如何从VCL主线程调用TThread对象的方法?

delphi - delphi自动滚动备忘录

扩展方法返回类型的 Java 泛型

mysql - cakephp3 中的递归?