![]() |
Compilerschalter MethodInfo global
Hi,
Ich brauche die erweiterte RTTI und benutze dazu den Compilerschalter
Delphi-Quellcode:
Ich brauche ihn aber für ALLE Klassen meines Projekts... Also auch für alle eingebundenen Units inklusive der VCL-Klassen.
{$METHODINFO ON}
Und ich kann/will nicht an den original VCL-Units rumfummeln bzw in jede Unit manuell diesen Schalter einbinden oder eine inc-Datei... :? Gruß Neutral General |
Re: Compilerschalter MethodInfo global
Zitat:
|
Re: Compilerschalter MethodInfo global
Macht das vielleicht NUnit? Kann man sich da das ansehen?
|
Re: Compilerschalter MethodInfo global
Zitat:
Zitat:
2. .NET ist wohl nicht das richtige... :? |
Re: Compilerschalter MethodInfo global
Wirkt dieser Schalter auf eine einzige Klasse oder auf eine ganze Klassenhierarchie? In letzterem Fall könntes du eine Basisklasse mit diesem Schalter definieren und alle Funktionen, die du brauchst, in solche Klassen auslagern. Diese Klassen würden dann ein Interface implementieren, das die jeweiligen Funktionen bereitstellt, implementieren. Ebenso die Klassen, denen diese Funktionen eingentlich zufallen sollten - dort fügst du eine Eigenschaft vom Typ des Interfaces ein, implementierst das Interface per delegation und fertig.
Beispiel:
Delphi-Quellcode:
Die _Self-Maschinerie musst du nur dann benutzen, wenn du nicht automatisch Zugriff auf die IFoo-Methoden hast - wie Delphi das genau löst, kann ich nicht sagen.
type
IFoo = interface procedure ShowFoo; end; {$METHODINFO ON} TMyObject = class(TInterfacedObject) end; TIntegerGetter = function: Integer of object; TFoo = class(TMyObject, IFoo) private fGetter: TIntegerGetter; public constructor Create(getter: TIntegerGetter); procedure ShowFoo; end; TActualClass = class(TIrgendwas, IFoo) private fFoo: TFoo; function IntegerGetter: Integer; function _self: IFoo; property FooImplementor: TFoo read fFoo implements IFoo; public constructor Create; end; constructor TFoo.Create(getter: TIntegerGetter); begin inherited Create; fGetter := getter; end; procedure TFoo.ShowFoo; begin ShowMessage(IntToStr(fGetter())); end; function TActualClass.IntegerGetter: Integer; begin result := 42; end; constructor TActualClass.Create; begin inherited; fFoo := TFoo.Create(IntegerGetter); _self.ShowFoo; end; function TActualClass._self: IFoo; begin result := IFoo(self); end; |
Re: Compilerschalter MethodInfo global
Hi Dax,
Zitat:
Ansonsten ginge deine Methode ja... Gruß Neutral General |
Re: Compilerschalter MethodInfo global
Puh! Das wird nicht zu machen sein, ohne in der VCL rumzufummeln.
|
Re: Compilerschalter MethodInfo global
Hi,
Naja an meiner eigenen (lokalen) VCL würd ich ja notfalls was verändern, aber das ganze brauche ich ja für eine Unit, die ich eventuell veröffentlichen will und da kann ich nicht von den Benutzern meiner Unit erwarten das sie in einer oder mehreren VCL-Units irgendwas ändern damit meine Unit funktioniert :? |
Re: Compilerschalter MethodInfo global
Zitat:
DUnit müsset doch für einen UnitTest auch die gesamte RTTI verwenden wollen, das war mein Ansatz. |
Re: Compilerschalter MethodInfo global
Hi,
Hab mir die Unit mal angeguckt, noch nicht getestet. Aber der Code kommt mir seltsam vor.
Delphi-Quellcode:
Diesen Code finde ich in einer Methode in dieser Unit. (habs etwas zerschnitten)
var
T: System.Type; // *) Methods: Array of MethodInfo; // **) begin T := AClass.ClassInfo; Methods := T.GetMethods(); // ***) end; *) Wie bitte? Also meine System.pas kennt sowas nicht o.O **) MethodInfo wurde da irgendwie nirgendwo deklariert. Es wurden auch keine fremden/eigenen Units eingebunden, außer:
Delphi-Quellcode:
was mir aber auch spanisch vorkommt :roll: 7
uses
{$IFDEF CLR} System.Reflection, {$ENDIF} Moment mal... bevor ich hier weiterschreibe... Ist das vielleicht Delphi .NET? Kommt mir grad ein bisschen so vor... Des weiteren habe ich beim googlen ![]() Zitat:
Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz