Книга программиста/Примеры рефлексии на PascalABC.Net

К оглавлению

Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда PascalABC.Net 3.0.

Пример 1

править
{Переведено с C#.}
uses System;
uses System.Reflection;

type
  User = class
  private 
    fName: string;
    fAge: integer;
  
  public 
    property Name: string read fName write fName; // Имя
    property Age: integer read fAge write fAge; // Возраст
    
    constructor ();
    begin
    end;
    
    procedure Display() := Console.WriteLine('Имя: {0} Возраст: {1}', Name, Age); // Выполняет вывод строкового представление объекта.
    
    function Payment(hours, perhour: integer) := hours * perhour; // Вычисляет зарплату.
  end;

begin
  var MyType := typeof(User);
  var MyType2 := &Type.GetType('Рефлексия - пример 1.User', false, true);
  
  Console.WriteLine(MyType.ToString());
  Console.WriteLine(MyType2.ToString());
  Console.ReadLine();
end.

Пример 2

править
{Переведено с C#.}
uses System;
uses System.Reflection;

type
  User = class
  private 
    fName: string;
    fAge: integer;
  
  public 
    property Name: string read fName write fName; // Имя
    property Age: integer read fAge write fAge; // Возраст
    
    constructor ();
    begin
    end;
    
    procedure Display() := Console.WriteLine('Имя: {0} Возраст: {1}', Name, Age); // Выполняет вывод строкового представление объекта.
    
    function Payment(hours, perhour: integer) := hours * perhour; // Вычисляет зарплату.
  end;

begin
  var man := new User();
  man.Name := 'Tom';
  man.Age := 30;
  
  var myType := man.GetType();
  
  foreach var member in myType.GetMembers() do
    Console.WriteLine('{0} {1} {2}', member.DeclaringType.Name, member.MemberType, member.Name);

  Console.ReadLine();
end.

Пример 3

править
{Переведено с C#.}
uses System.Reflection;

type
  TUser = class
  private 
    _Name: string;
    _Age: integer;
  public 
    property Name: string read _Name write _Name;
    property Age: integer read _Age write _Age;
    
    constructor ();begin end;
    
    procedure Display() := WritelnFormat('Имя: {0} Возраст: {1}', Name, Age);
    
    function Payment(hours, perhour: integer) := hours * perhour;
  end;

begin
{Переведено с C#.}
uses System;
uses System.Reflection;

type
  User = class
  private 
    fName: string;
    fAge: integer;
  
  public 
    property Name: string read fName write fName; // Имя
    property Age: integer read fAge write fAge; // Возраст
    
    constructor ();
    begin
    end;
    
    procedure Display() := Console.WriteLine('Имя: {0} Возраст: {1}', Name, Age); // Выполняет вывод строкового представление объекта.
    
    function Payment(hours, perhour: integer) := hours * perhour; // Вычисляет зарплату.
  end;

begin
  var man := new User();
  man.Name := 'Tom';
  man.Age := 30;
  
  var myType := man.GetType();
  
  foreach var member in myType.GetMethods() do
  begin
    var modifier := '';
    
    if member.IsStatic then
      modifier += 'static '
    else if member.IsVirtual then
      modifier += 'virtual';
    
    if string.IsNullOrEmpty(modifier) then
      Console.Write('{0} {1}(', member.ReturnType.Name, member.Name)
    else
      Console.Write('{0} {1} {2}(', modifier, member.ReturnType.Name, member.Name);
    
    var parameters := member.GetParameters();
    
    for var i := 0 to Length(parameters) - 1 do
    begin
      Console.Write('{0} {1}', parameters[i].ParameterType.Name, parameters[i].Name);
      
      if i + 1 < parameters.Length then
        Console.Write(', ');
    end;
    Console.WriteLine(')');
  end;
  
  Console.ReadLine();
end.

Пример 4

править
{Переведено с C#.}
uses System;
uses System.Reflection;

type
  User = class
  private 
    fName: string;
    fAge: integer;
  
  public 
    property Name: string read fName write fName; // Имя
    property Age: integer read fAge write fAge; // Возраст
    
    constructor (name: string; age: integer);
    begin
      fName := name;
      fAge := age;
    end;
    
    procedure Display() := Console.WriteLine('Имя: {0} Возраст: {1}', Name, Age); // Выполняет вывод строкового представление объекта.
    
    function Payment(hours, perhour: integer) := hours * perhour; // Вычисляет зарплату.
  end;

begin
  var man := new User('Tom', 30);
  
  var myType := man.GetType();
  
  foreach var m in myType.GetConstructors() do
  begin
    Console.Write(m.Name + '(');
    
    var parameters := m.GetParameters();
    
    for var i := 0 to Length(parameters) - 1 do
    begin
      Console.Write('{0} {1}', parameters[i].ParameterType.Name, parameters[i].Name);
      
      if i + 1 < parameters.Length then
        Console.Write(', ');
    end;
    
    Console.WriteLine(')');
  end;
  
  Console.ReadLine();
end.

Пример 5

править
{Переведено с C#.}
uses System.Reflection;

type
  TUser = class
  private 
    _Name: string;
    _Age: integer;
  public 
    property Name: string read _Name write _Name;
    property Age: integer read _Age write _Age;
    
    constructor(n: string; a: integer);
    begin
      Name := n;
      Age := a;
    end;
    
    procedure Display() := WritelnFormat('Имя: {0} Возраст: {1}', Name, Age);
    
    function Payment(hours, perhour: integer) := hours * perhour;
  end;

begin
  var Man := new TUser('Tom', 30);
  
  var MyType := Man.GetType();
  
  Writeln('Fields:');
  foreach var f in MyType.GetFields() do
    WritelnFormat('{0} {1}', f.FieldType, f.Name);
  
  Writeln('Properties:');
  foreach var p in MyType.GetProperties() do
    WritelnFormat('{0} {1}', p.PropertyType, p.Name);
  
  Readln();
end.