Les procédures Write
et Writeln
ne peuvent pas être appelées avec des arguments génériques. Ainsi, la conclusion évidente est que vous devez convertir la valeur générique en une chaîne avant d'appeler Write
et Writeln
.
Ceci peut être réalisé en utilisant TValue
en tirant parti des fonctionnalités suivantes:
- La méthode
TValue.From<T>
générique qui fait une nouvelle instance TValue
.
- La méthode
TValue.ToString
qui convertit les types les plus courants en chaîne.
Donc, je pense que vous cherchez quelque chose comme ceci:
{$APPTYPE CONSOLE}
uses
System.Rtti;
type
TMyClass = class
class procedure Write<T>(const arr: array of T; const Name: string); static;
end;
class procedure TMyClass.Write<T>(
const arr: array of T; const Name: string);
var
I: Integer;
begin
System.Write('Array ' + Name +' : [');
for I := 0 to high(arr) do begin
System.Write(TValue.From(arr[i]).ToString);
if I <> high(arr) then begin
System.Write(', ');
end;
end;
System.Writeln(']');
end;
begin
TMyClass.Write<Integer>([1,2,3,4], 'integer');
TMyClass.Write<Double>([42.666, 123.4], 'floating point');
TMyClass.Write<string>(['foo', 'bar'], 'string');
Readln;
end.
Sortie
Array integer : [1, 2, 3, 4]
Array floating point : [42.666, 123.4]
Array string : [foo, bar]
En aparté, il me contrarie vraiment que je dois créer une classe pour contenir ces méthodes. Je ne comprends pas pourquoi les concepteurs de langage ont pris cette décision.
Pourriez-vous clarifier la question? Votre code fonctionne très bien. C'est une fois que vous corrigez les erreurs de syntaxe –
Je suppose qu'il ou elle veut faire cela pour tout type de T dans TArray, IOW, (s) il veut une procédure de classe Imprimer (const A: TArray ; const Nom: chaîne); Je suppose (s) qu'il ne sait pas comment faire la partie 'Write (A [I])' si 'A [I] 'est générique. –
@RudyVelthuis Exactement! Cordes, etc. – user3764855