As can be seen in the syntax diagrams for generic procedures and functions, it is possible to define
generic procedures and functions or generic methods. Where in a generic class type all methods of
the class can contain the template, it is possible to have a non-generic class with a generic
method:
                                                                            
                                                                            
uses typinfo;
 
 
type
 
  TMyEnum = (one,two,three);
 
 
  TTypeHelper = class(TObject)
 
    generic procedure PrintTypeName<T>(a : T);
 
  end;
 
 
generic procedure TTypeHelper.PrintTypeName<T>(a : T);
 
begin
 
  Writeln(PTypeInfo(typeInfo(T)) ˆ.name);
 
end;
 
 
var
 
  Helper : TTypeHelper;
 
 
begin
 
  Helper.specialize PrintTypeName<TMyEnum>(one);
 
end.
or, in Delphi syntax:
                                                                            
                                                                            
uses typinfo;
 
 
type
 
  TMyEnum = (one,two,three);
 
 
  TTypeHelper = class(TObject)
 
    procedure PrintTypeName<T>(a : T);
 
  end;
 
 
procedure TTypeHelper.PrintTypeName<T>(a : T);
 
begin
 
  Writeln(PTypeInfo(typeInfo(T)) ˆ.name);
 
end;
 
 
var
 
  Helper : TTypeHelper;
 
 
begin
 
  Helper.PrintTypeName<TMyEnum>(one);
 
end.
Both global procedures or functions can also be generic:
                                                                            
                                                                            
ses typinfo;
 
 
type
 
  TMyEnum = (one,two,three);
 
 
generic function GetTypeName<T>(a : T) : string;
 
 
begin
 
  Result:=PTypeInfo(typeInfo(T))ˆ.name;
 
end;
 
 
begin
 
  Writeln(specialize GetTypeName<TMyEnum>(one));
 
end.
It is even possible to use them in Delphi mode:
                                                                            
                                                                            
uses typinfo;
 
 
type
 
  TMyEnum = (one,two,three);
 
 
function GetTypeName<T>(a : T) : string;
 
 
begin
 
  Result:=PTypeInfo(typeInfo(T))ˆ.name;
 
end;
 
 
begin
 
  Writeln(GetTypeName<TMyEnum>(one));
 
end.
But this code is not compilable with Delphi. In delphi, the closest thing to this feature is to use a
record or class with generic class methods:
                                                                            
                                                                            
uses typinfo;
 
 
type
 
  TMyEnum = (one,two,three);
 
 
  TTypeHelper = class(TObject)
 
    class procedure PrintTypeName<T>(a : T);
 
  end;
 
 
class procedure TTypeHelper.PrintTypeName<T>(a : T);
 
begin
 
  Writeln(PTypeInfo(typeInfo(T)) ˆ.name);
 
end;
 
 
begin
 
  TTypeHelper.PrintTypeName<TMyEnum>(one);
 
end.