Autor Téma: Konstruktor atributu a prvek nad kterým je definován  (Přečteno 1131 krát)

Offline Tomáš Jantač

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 3
    • Verze Delphi: 7, XE4/5/7
Nevíte, jestli lze získat v konstruktoru atributu prvek pro který je tento atribut definován?

Kód: Delphi [Vybrat]
  1. type
  2.   XyAttribute = class(TCustomAttribute)
  3.   public
  4.     constructor Create(const AName:string);
  5.   end;
  6.  
  7.   [XyAttribute('Bflmpsvz')]
  8.   TXyObject = class
  9.   public
  10.   end;
  11.  
  12. constructor XyAttribute.create(const AName: string);
  13. begin
  14.   { jak zde získat třídu na které je atribut definován (tj. TXyObject) ? }
  15. end;

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Konstruktor atributu a prvek nad kterým je definován
« Odpověď #1 kdy: 15-12-2015, 08:46:38 »
No zkousel jsem si to krokovat a pak jsem si uvedomil, ze atributy jsou natolik obecna separatni vec, ze asi ne.

Ale to mne privadi spise k myslence, ze ty explicitne stejne musis s tou instanci pracovat, jelikoz atributy se vytvori az v okamziku, kdy je potrebujes.
Takze by nemel byt problem nad temi atributy neco zavolat:

Kód: Delphi [Vybrat]
  1. var
  2.   LContext: TRttiContext;
  3.   LType: TRttiType;
  4.   LAttr: TCustomAttribute;
  5. begin
  6.   LContext := TRttiContext.Create;
  7.  
  8.   { Extract type information TXyObject type }
  9.   LType := LContext.GetType(TypeInfo(TXyObject));
  10.  
  11.   { Search for XyAttribute attribute }
  12.   for LAttr in LType.GetAttributes() do <--------------- tady se ti vytvori atributy a vola se konstruktor
  13.   begin
  14.     if LAttr is XyAttribute then  
  15.       Writeln(XyAttribute(LAttr).FName); <--------------- tady si tu instanci muzes upravit a v LType mas ten typ
  16.   end;
  17.  
  18.   { Destroy the context }
  19.   LContext.Free;
  20.  


Co vlastne chces delat?
Embarcadero MVP - Czech republic

Offline Tomáš Jantač

  • Nováček
  • *
  • Příspěvků: 33
  • Karma: 3
    • Verze Delphi: 7, XE4/5/7
Re:Konstruktor atributu a prvek nad kterým je definován
« Odpověď #2 kdy: 15-12-2015, 10:34:20 »
Aha, no to jste mě nepotěšil. To jsem netušil.

Chtěl jsem vytvořit základní třídu s hierarchickou strukturou, kde by se pomocí atributu daná třída registrovala do seznamu možností svých možných vlastníků.
Kdysi jsem něco takového viděl v C#.

Každopádně v případě, že se atribut tvoří až při jeho dotazování, je toto využití naprosto nepoužitelné.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 576
  • Karma: 25
Re:Konstruktor atributu a prvek nad kterým je definován
« Odpověď #3 kdy: 22-12-2015, 23:22:48 »
Aha, no to jste mě nepotěšil. To jsem netušil.

Chtěl jsem vytvořit základní třídu s hierarchickou strukturou, kde by se pomocí atributu daná třída registrovala do seznamu možností svých možných vlastníků.
Kdysi jsem něco takového viděl v C#.

Každopádně v případě, že se atribut tvoří až při jeho dotazování, je toto využití naprosto nepoužitelné.

Třeba bys to mohl udělat obráceně - to co spravuje seznam si zjistí seznam typu a z nich vybere ty, které mají ten atribut a zaregistruje je...

Jinak mě by přišlo logické, že atributy se budou vyvářet v době, kdy se začne natahovat daný typ (což je na místě, kde se ten typ poprvé použije).