Ihr Code kann nicht kompiliert werden, da der Compiler zur Kompilierzeit der generischen Klasse nicht garantieren kann, dass eine Konvertierung in alle denkbaren T
möglich ist.
Wenn mit
intf.Work(param);
in der generischen Methode konfrontiert der Compiler muss wissen, wie param
-OleVariant
zu konvertieren. Und es kann nicht so sein. Dies ist eine der Einschränkungen von Generika im Vergleich zu Vorlagen.
Die einfachste Lösung für Sie ist es, die Umwandlung zur Laufzeit mit Hilfe von TValue
von der Rtti
Einheit zu tun.
procedure MyClass<T>.MyWork(param: T);
begin
intf.Work(TValue.From<T>(param).AsVariant);
end;
Und hier ist ein Beispieltestprogramm zu zeigen, dass TValue
den Job:
program SO15113162;
{$APPTYPE CONSOLE}
uses
Rtti;
procedure Work(param: OleVariant);
begin
Writeln(param);
end;
type
MyClass<T> = class
class procedure MyWork(param: T);
end;
class procedure MyClass<T>.MyWork(param: T);
begin
Work(TValue.From<T>(param).AsVariant);
end;
begin
MyClass<Double>.MyWork(2.4);
MyClass<string>.MyWork('hello');
MyClass<Integer>.MyWork(-666);
Readln;
end.
Ausgabe
2.4
hello
-666
Warum oh warum ist diese feine Frage immer enger Stimmen? Sehen die Wähler überhaupt nach, worüber sie abstimmen? –
Keine Sorge, wir können immer wieder öffnen :-) – Johan
@Johan Wir sollten nicht müssen. Diese Review-Warteschlangen bei SO sind einfach dumm. –