Delphi 2010: Nuovo RTTI, impostando il valore della proprietà su un valore arbitrario

StackOverflow https://stackoverflow.com/questions/1603427

  •  05-07-2019
  •  | 
  •  

Domanda

TRTTIProperty.SetValue () accetta un'istanza TValue, ma se l'istanza TValue fornita si basa su un tipo diverso, la proprietà esplode.

per es.

TMyObject = class
published
  property StringValue: string read FStringValue write FStringValue;
end;

procedure SetProperty(obj: TMyObject);
var
  context: TRTTIContext;
  rtti: TRTTIType;
  prop: TRTTIProperty;
  value: TValue;
begin
  context := TRTTIContext.Create;
  rtti := context.GetType(TMyObject);
  prop := rtti.GetProperty('StringValue');
  value := 1000;
  prop.SetValue(obj, value);
end;

Anche il tentativo di trasmettere il valore a una stringa non funzionerà.

prop.SetValue(obj, value.AsString);
prop.SetValue(obj, value.Cast(prop.PropertyType.Handle));

Qualche idea su come risolverlo?

UPDATE:

Alcuni di voi si chiedono perché voglio assegnare un numero intero a una stringa e cercherò di spiegare. (In realtà, è più probabile che io voglia assegnare una stringa a un numero intero, ma non è così rilevante ...)

Quello che sto cercando di realizzare è creare un "intermediario" generale tra gui e modello. Voglio in qualche modo agganciare un campo textedit a una proprietà. Invece di creare un uomo così centrale per ogni modello che ho, speravo che la nuova cosa RTTI / TValue avrebbe funzionato un po 'di magia per me.

Sono anche nuovo ai generici, quindi non sono sicuro di come i generici avrebbero potuto aiutare. È possibile creare un'istanza di un generico in fase di esecuzione con un tipo deciso in modo dinamico oppure è necessario che la compilazione lo sappia?

per es.

TMyGeneric<T> = class
end;

procedure DoSomething( );
begin
  prop := rtti.getProperty('StringValue');
  mygen := TMyGeneric<prop.PropertyType>.Create;
  //or
  mygen := TMyGeneric<someModel.Class>.Create;
end;

Forse l'era della magia deve ancora venire ... Immagino di riuscire a gestire un paio di grandi case ...

È stato utile?

Soluzione

TValue non è una variante. Puoi solo leggere il tipo di dati che " tu " messo in esso.

TValue.Cast non funziona perché ha la stessa semantica dei cast di tipi impliciti. Non è possibile assegnare un numero intero a una stringa o viceversa. Ma puoi assegnare un numero intero a un float oppure puoi assegnare un numero intero a un int64.

Altri suggerimenti

Non posso provarlo adesso, ma avrei scritto:

  value := '1000'; 
  prop.SetValue(obj, value);

try

prop.SetValue (obj, value.ToString)

Ma per me è la stessa domanda di Fran & # 231; ois. Perché vuoi impostare la proprietà con un valore del tipo di dati errato?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top