AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RTTI und Generics

Ein Thema von Daniela.S · begonnen am 5. Sep 2011 · letzter Beitrag vom 5. Sep 2011
Antwort Antwort
Benutzerbild von Daniela.S
Daniela.S

Registriert seit: 1. Mär 2008
Ort: Niederösterreich
224 Beiträge
 
Delphi XE4 Enterprise
 
#1

RTTI und Generics

  Alt 5. Sep 2011, 09:14
Delphi-Version: XE
Schönen guten Morgen,

bislang habe ich die RTTI nie benutzt, jetzt hätte ich mal ein wenig Zeit mich damit zu beschäftigen... Aber irgendwie scheitert es schon bei den ersten Schritten...

Ich würde gerne die Objekte in einer generischen Liste durchsuchen. Allerdings klappt die Abfrage bei GetProperty nicht so richtig. Vielleicht hat jemand von euch einen Tipp für mich?

Gefunden hätte ich ja einiges, aber immer nur bei direkter Angabe der Klasse in GetValue, aber die soll ja austauschbar sein.



Delphi-Quellcode:
  TMyClass = class
  private
    fName : String;
    fValue : Integer;
  published
    property Name: String read fName write fName;
    property Value: Integer read fValue write fValue;
  end;



  TMyList<T> = class
  private
    fList : TList<T>;
  public
    constructor Create;
    function Find( const Param: String; const Value: Variant ): T;
    function Add( const Value: T ): Integer;
  end;



var
  test : TmyList<TMyClass>;
begin
   // bisschen was hinzufügen
  {...}
  test.Find( 'Value', 100 );
  {...}
end;
  


function TMyList<T>.Find( const Param: String; const Value: Variant ): T;
var
  context : TRttiContext;
  typeInfo : TRttiType;
  prop : TRttiProperty;
  item : T;
  v : TValue;
begin
  context := TRttiContext.Create;
  try
    typeInfo := context.GetType( System.TypeInfo(T) );
    prop := typeInfo.GetProperty( Param );

    for item in fList do begin
      v := prop.GetValue( @item ); // <- stimmt das?
      if v.AsVariant = Value then begin
        Result := item;
        Break;
        end;
      end;
  finally
    context.Free;
    end;
end;

Geändert von Daniela.S ( 5. Sep 2011 um 09:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Daniela.S
Daniela.S

Registriert seit: 1. Mär 2008
Ort: Niederösterreich
224 Beiträge
 
Delphi XE4 Enterprise
 
#2

AW: RTTI und Generics

  Alt 5. Sep 2011, 09:36
Typisch, zuerst der Verzweiflung nahe, einen Kaffee später gefunden


prop.GetValue( item as TObject ); trotzdem danke fürs lesen
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#3

AW: RTTI und Generics

  Alt 5. Sep 2011, 09:59
Typisch, zuerst der Verzweiflung nahe, einen Kaffee später gefunden
prop.GetValue( item as TObject ); trotzdem danke fürs lesen
Das ist eigentlich falsch.
Denn wenn du diesen Cast machst, macht dein Code ja die Annahme, dass T zuweisungskompatibel zu TObject ist.
Sowas drückt sollte man dem Typen-Parameter gleich mitgeben. Denn fast jede Annahme im Code sollte als Bug angesehen werden.

Ich kenne mich mit Delphis IMO etwas komischen Generics-Syntax nicht so gut aus, aber ich denke, dass sieht dort so aus:
 TMyList<T: TObject> = class Danach sollte der Kompiler wissen, dass jedes T auch ein TObject ist. Also brauchsu keinen Cast mehr.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: RTTI und Generics

  Alt 5. Sep 2011, 10:32
Du kannst mit PropInfo.PropertyType.TypeKind auch prüfen, um was für eine Eigenschaft es sich handelt.


Delphi-Quellcode:
procedure TodProp.ClearPointer(const od: Tod; p: Tod);
var
  Context: TRttiContext;
  RttiType: TRttiType;
  PropInfo: TRttiProperty;
  F: Boolean;
  Attr: TCustomAttribute;
  Value: TValue;
  O: TObject;
  PropValue: String;
begin
  if (not Assigned(od)) or (not Assigned(p)) then
    Exit;
  od.HasNotOdPointer := True;

  Context := TRttiContext.Create;
  RttiType := Context.GetType(od.ClassType);

  if Assigned(RttiType) then
  begin
    for PropInfo in RttiType.GetProperties do
    begin
      F := False;
      for Attr in PropInfo.GetAttributes do
      begin
        if Attr is AttrOd then
          F := True;
      end;
      if F then
      begin
        PropValue := '';
        Value := TValue.Empty;
        case PropInfo.PropertyType.TypeKind of // <<===============
          tkClass:
            begin
              if PropInfo.IsWritable then
              begin
                od.HasNotOdPointer := False;
                Value := PropInfo.GetValue(od);
                if (not Value.IsEmpty) then
                begin
                  O := Value.AsObject;
                  if O = p then
                  begin
                    Value := nil;
                    PropInfo.SetValue(od, Value);
                  end;
                end;
              end;
            end;
          //...
        end;
      end;
    end;
  end;

  Context.Free;
end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: RTTI und Generics

  Alt 5. Sep 2011, 11:07
Korrekter constraint in deinem Falle wäre: TMyList<T: class> = class und dann kannst du direkt GetValue(item) schreiben, weil der Compiler weiß, dass item auf jeden Fall ein TObject Derivat ist.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Daniela.S
Daniela.S

Registriert seit: 1. Mär 2008
Ort: Niederösterreich
224 Beiträge
 
Delphi XE4 Enterprise
 
#6

AW: RTTI und Generics

  Alt 5. Sep 2011, 11:32
Danke euch.
Aber ich denke ich gebe es wieder auf. Bekomme einen Internen Fehler (meistens F2048: AV221E0FCF-R...) nach dem anderen und verbringe mehr Zeit damit meinen Code irgendwie so umzuschreiben damit kein Fehler kommt.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: RTTI und Generics

  Alt 5. Sep 2011, 11:52
Ich lag wohl mit meinem Beitrag daneben - Du willst ja keine Eigenschaft als Objekt behandeln.

Aber vielleicht solltest Du noch prüfen, ob typeInfo und prop etwas zugewiesen wird.
So weit kannst Du von einer Lösung eigentlich nicht weg sein...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: RTTI und Generics

  Alt 5. Sep 2011, 12:03
Danke euch.
Aber ich denke ich gebe es wieder auf. Bekomme einen Internen Fehler (meistens F2048: AV221E0FCF-R...) nach dem anderen und verbringe mehr Zeit damit meinen Code irgendwie so umzuschreiben damit kein Fehler kommt.
Wenn man ansatzweise verstanden hat (kostet etwas Zeit und Nerven), was zu diesen Fehlern führt, dann kann man viel Spaß mit Generics haben.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz