带数组参数的属性构造函数
Attribute constructor with array parameter
好吧,今天我在这里重写了一些旧东西,让自己陷入了一个我不知道答案的问题。
我创建了以下属性:
Enumeration<T> = class(TCustomAttribute)
strict private
{ Private declarations }
FValues : TList<T>;
public
{ Public declarations }
constructor Create(const AValues : array of T);
destructor Destroy(); override;
public
{ Public declarations }
property Values : TList<T> read FValues;
end;
考虑到这一点,我可以在以下 class 中很好地使用此属性,例如:
[Entity('tablename')]
TUser = class(TEntity)
strict private
[Column('idcolumnname')]
[PrimaryKey(True)]
Fid : TInteger;
[Column('typecolumnname')]
[Enumeration<string>(['A', 'B', 'C', 'D', '...'])]
Ftype: TEnumeration<string>;
end;
它的工作很棒,但是 idk,在我看来这不应该工作,因为我的无知,delphi 属性只需要常量类型而且我不仅使用数组作为参数而且通用的。
前进,我做了这个属性:
Association = class(TCustomAttribute)
strict private
{ Private declarations }
FMasterKeys : TList<string>;
FDetailKeys : TList<string>;
public
{ Public declarations }
constructor Create(const AMasterKeys, ADetailKeys : array of string);
destructor Destroy(); override;
public
{ Public declarations }
property MasterKeys : TList<string> read FMasterKeys;
property DetailKeys : TList<string> read FDetailKeys;
end;
并尝试在此 class 上使用:
[Entity('tablename')]
TSuperUser = class(TEntity)
strict private
[Association(['masterkey'], ['detailkey'])]
Fuser : TAssociation<TUser>;
end;
我收到一个错误 [DCC 错误] E2026 需要常量表达式。
好的,所以在简历中我只是不知道发生了什么,为什么我可以使用 T 数组而不是字符串数组作为属性参数。
感谢提前的帮助
检查编译器警告。它应该为你的 "compiling code" 说 W1025 Unsupported language feature: 'custom attribute'
。所以你虽然编译了但实际上没有。它只是没有引发错误。
这通常是因为找不到通用属性而无法找到属性 class 的情况。在XE7中依然如此
底线:即使它确实编译了您的可执行文件也不会包含该属性。
好吧,今天我在这里重写了一些旧东西,让自己陷入了一个我不知道答案的问题。
我创建了以下属性:
Enumeration<T> = class(TCustomAttribute)
strict private
{ Private declarations }
FValues : TList<T>;
public
{ Public declarations }
constructor Create(const AValues : array of T);
destructor Destroy(); override;
public
{ Public declarations }
property Values : TList<T> read FValues;
end;
考虑到这一点,我可以在以下 class 中很好地使用此属性,例如:
[Entity('tablename')]
TUser = class(TEntity)
strict private
[Column('idcolumnname')]
[PrimaryKey(True)]
Fid : TInteger;
[Column('typecolumnname')]
[Enumeration<string>(['A', 'B', 'C', 'D', '...'])]
Ftype: TEnumeration<string>;
end;
它的工作很棒,但是 idk,在我看来这不应该工作,因为我的无知,delphi 属性只需要常量类型而且我不仅使用数组作为参数而且通用的。
前进,我做了这个属性:
Association = class(TCustomAttribute)
strict private
{ Private declarations }
FMasterKeys : TList<string>;
FDetailKeys : TList<string>;
public
{ Public declarations }
constructor Create(const AMasterKeys, ADetailKeys : array of string);
destructor Destroy(); override;
public
{ Public declarations }
property MasterKeys : TList<string> read FMasterKeys;
property DetailKeys : TList<string> read FDetailKeys;
end;
并尝试在此 class 上使用:
[Entity('tablename')]
TSuperUser = class(TEntity)
strict private
[Association(['masterkey'], ['detailkey'])]
Fuser : TAssociation<TUser>;
end;
我收到一个错误 [DCC 错误] E2026 需要常量表达式。
好的,所以在简历中我只是不知道发生了什么,为什么我可以使用 T 数组而不是字符串数组作为属性参数。
感谢提前的帮助
检查编译器警告。它应该为你的 "compiling code" 说 W1025 Unsupported language feature: 'custom attribute'
。所以你虽然编译了但实际上没有。它只是没有引发错误。
这通常是因为找不到通用属性而无法找到属性 class 的情况。在XE7中依然如此
底线:即使它确实编译了您的可执行文件也不会包含该属性。