首先这是我在这里的第一篇文章,所以我首先要为我糟糕的英语道歉,其次我要为任何听起来可能是愚蠢的问题道歉
好吧,我正在尝试为 MySQL、Delphi 和我在这里工作的团队编写我自己的 ORM,但是我陷入了一些我不知道该怎么做的事情中,我将在我的课程的最终定义上发布。
uses
hsORM.Mapping,
hsORM.Types;
type
[ThsORMTableMap('hscad_cadmunicipal')]
TMunicipe = class(ThsORMTable)
private
{ Private declarations }
[ThsORMColumnPrimaryKeyMap('inscricaomunicipal')]
Fid : ThsORMColumnPrimaryKey;
[ThsORMColumnNullableMap('idlogradouro', varInteger)]
Fidlogradouro : ThsORMColumnNullable;
[ThsORMColumnNullableMap('idbairro', varInteger)]
Fidbairro : ThsORMColumnNullable;
[ThsORMColumnNullableMap('idestadocivil', varInteger)]
Fidestadocivil : ThsORMColumnNullable;
[ThsORMColumnNullableMap('idnaturezaestab', varInteger)]
Fidnaturezaestabelecimento : ThsORMColumnNullable;
[ThsORMColumnNullableMap('idnaturezajuridica', varInteger)]
Fidnaturezajuridica : ThsORMColumnNullable;
[ThsORMColumnNullableMap('idagencia', varInteger)]
Fidagencia : ThsORMColumnNullable;
[ThsORMColumnMap('datacadastro')]
Fdatacadastro : ThsORMColumnDate;
[ThsORMColumnMap('nome')]
Fnome : ThsORMColumnString;
[ThsORMColumnNullableMap('nomefantasia', varString)]
Fnomefantasia : ThsORMColumnNullable;
[ThsORMColumnMap('tipopessoa')]
Ftipopessoa : ThsORMColumnString;
[ThsORMColumnNullableMap('numero', varInteger)]
Fnumero : ThsORMColumnNullable;
[ThsORMColumnNullableMap('complemento', varString)]
Fcomplemento : ThsORMColumnNullable;
[ThsORMColumnNullableMap('observacao', varString)]
Fobservacao : ThsORMColumnNullable;
[ThsORMColumnNullableMap('telefone', varString)]
Ftelefone : ThsORMColumnNullable;
[ThsORMColumnNullableMap('celular', varString)]
Fcelular : ThsORMColumnNullable;
[ThsORMColumnNullableMap('fax', varString)]
Ffax : ThsORMColumnNullable;
[ThsORMColumnNullableMap('sexo', varString)]
Fsexo : ThsORMColumnNullable;
[ThsORMColumnNullableMap('email', varString)]
Femail : ThsORMColumnNullable;
[ThsORMColumnNullableMap('responsavel', varString)]
Fresponsavel : ThsORMColumnNullable;
[ThsORMColumnNullableMap('contacorrente', varString)]
Fcontacorrente : ThsORMColumnNullable;
[ThsORMColumnMap('foto')]
Ffoto : ThsORMColumnBlob;
[ThsORMColumnMap('fornecedor')]
Ffornecedor : ThsORMColumnBoolean;
[ThsORMColumnMap('tipocredor')]
Ftipocredor : ThsORMColumnString;
[ThsORMColumnMap('ativo')]
Fativo : ThsORMColumnBoolean;
public
{ Public declarations }
property id : ThsORMColumnPrimaryKey read Fid write Fid;
property idlogradouro : ThsORMColumnNullable read Fidlogradouro write Fidlogradouro;
property idbairro : ThsORMColumnNullable read Fidbairro write Fidbairro;
property idestadocivil : ThsORMColumnNullable read Fidestadocivil write Fidestadocivil;
property idnaturezaestabelecimento : ThsORMColumnNullable read Fidnaturezaestabelecimento write Fidnaturezaestabelecimento;
property idnaturezajuridica : ThsORMColumnNullable read Fidnaturezajuridica write Fidnaturezajuridica;
property idagencia : ThsORMColumnNullable read Fidagencia write Fidagencia;
property datacadastro : ThsORMColumnDate read Fdatacadastro write Fdatacadastro;
property nome : ThsORMColumnString read Fnome write Fnome;
property nomefantasia : ThsORMColumnNullable read Fnomefantasia write Fnomefantasia;
property tipopessoa : ThsORMColumnString read Ftipopessoa write Ftipopessoa;
property numero : ThsORMColumnNullable read Fnumero write Fnumero;
property complemento : ThsORMColumnNullable read Fcomplemento write Fcomplemento;
property observacao : ThsORMColumnNullable read Fobservacao write Fobservacao;
property telefone : ThsORMColumnNullable read Ftelefone write Ftelefone;
property celular : ThsORMColumnNullable read Fcelular write Fcelular;
property fax : ThsORMColumnNullable read Ffax write Ffax;
property sexo : ThsORMColumnNullable read Fsexo write Fsexo;
property email : ThsORMColumnNullable read Femail write Femail;
property responsavel : ThsORMColumnNullable read Fresponsavel write Fresponsavel;
property contacorrente : ThsORMColumnNullable read Fcontacorrente write Fcontacorrente;
property foto : ThsORMColumnBlob read Ffoto write Ffoto;
property fornecedor : ThsORMColumnBoolean read Ffornecedor write Ffornecedor;
property tipocredor : ThsORMColumnString read Ftipocredor write Ftipocredor;
property ativo : ThsORMColumnBoolean read Fativo write Fativo;
end;
好吧,我为每个 mysql 数据类型定义了一个相应的类。那么我接下来要做的是使用 RTTI 来创建动态的每个 os 这个字段。因为delphi中的类需要显式创建并且我试图避免这种情况,所以我试图做的是使用我的类 ThsORMTable 来创建动态的这个列。例如:
ThsORMTable = class
private
{ Private declarations }
FTableName: string;
procedure InitializeTable();
procedure InitializeColumns();
public
{ Public declarations }
constructor Create();
property TableName : string read FTableName write FTableName;
end;
{ ThsORMTable }
{$REGION 'Private'}
procedure ThsORMTable.InitializeTable();
var
AContext : TRttiContext;
AType : TRttiType;
AAttribute : TCustomAttribute;
AFound : Boolean;
begin
AContext := TRttiContext.Create();
try
AFound := False;
AType := AContext.GetType(ClassType);
for AAttribute in AType.GetAttributes do
if(AAttribute is ThsORMTableMap) then
begin
FTableName := (AAttribute as ThsORMTableMap).TableName;
AFound := True;
Break;
end;
if not(AFound) then raise Exception.Create(ETableNotMapped);
finally
AContext.Free();
end;
end;
procedure ThsORMTable.InitializeColumns();
var
AContext : TRttiContext;
AType : TRttiType;
AField : TRttiField;
AFound : Boolean;
begin
AContext := TRttiContext.Create();
try
AType := AContext.GetType(ClassType);
for AField in AType.GetFields do
/**********************************************
here i want something like for example
if(AField is ThsORMColumnInteger) then
begin
(AField as ThsORMColumnInteger) := ThsORMColumnInteger.Create();
is this possible? im going to the wrong way?
end;
**********************************************/
finally
AContext.Free();
end;
end;
{$ENDREGION}
{$REGION 'Public'}
constructor ThsORMTable.Create();
begin
try
InitializeTable();
InitializeColumns();
except on Error : Exception do
raise ThsORMTableInitialization.Create(Format(ETableInitializationError, [Error.Message]));
end;
end;
{$ENDREGION}
但无论如何我都会遇到编译错误。希望你们能帮助我。thx 优势
更新:对不起,我不清楚,我再试一次。我试图做的是,通过我的祖先类 ThsORMTable,具体地在构造函数方法上初始化每个字段(创建),所以我不需要显式创建从这个祖先继承的每个类中的每个字段