2015-01-13 3 views
3

Сегодня я переписывал здесь несколько вещей, и я попал в проблему, и я не знаю ответа.Конструктор атрибутов с параметром массива

я создал следующий атрибут:

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; 

с этим в виду, я могу использовать этот атрибут только штрафом в следующем классе, например:

[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; 

и пытался использовать в этом классе:

[Entity('tablename')] 
TSuperUser = class(TEntity) 
strict private 
    [Association(['masterkey'], ['detailkey'])] 
    Fuser : TAssociation<TUser>; 
end; 

я получил ошибку [DCC Error] E2026 Постоянное выражение ожидается.

ОК, поэтому в резюме я просто не знаю, что происходит Почему я могу использовать массив T как параметр атрибута, а не массив строки, например.

ТНХ за любую помощь заранее

+1

http://stackoverflow.com/questions/25746629/vcl-printers-pas888-w1025-unsupported-language-feature-custom-attribute –

+0

@David ТНХ для справки – kabstergo

ответ

5

Проверьте предупреждения компилятора. Он должен сказать W1025 Unsupported language feature: 'custom attribute' для вашего «кода компиляции». Итак, то, что вы, хотя компилирует, на самом деле не было. Это просто не вызвало ошибку.

Обычно это случай, когда класс атрибута не может быть найден, потому что у вас не могут быть общие атрибуты. И все еще имеет место в XE7.

Итог: даже если он скомпилировал ваш исполняемый файл, этот атрибут не будет содержать.

+0

да, на самом деле это сообщение является на выходе, но я не понимаю, я удалил приложение exe из выходной папки, и компиляция снова построила его, несмотря на то, что вы сказали, что на самом деле это не удалось. так что же произошло? я имею в виду непревзойденную функцию с успехом выхода компиляции, это приведет к тому, что именно? глючный исполняемый файл ?! – kabstergo

+0

Он не будет содержать атрибут. –

Смежные вопросы