官术网_书友最值得收藏!

  • Expert Delphi
  • Pawe? G?owacki
  • 267字
  • 2021-07-02 20:44:24

Runtime Type Information

RTTI provides reflection capabilities to the Object Pascal language. With reflection, different types of meta-programming scenarios are possible. You can, for example, write code that will be able to operate on objects that it does not know about. RTTI provides abstractions for all the different types available in the Object Pascal language in the System.Rtti unit that comes with Delphi. All classes and built-in simple types can be treated in a unified way using the TValue record. If you want to programmatically inspect a type and to know whether it is a class and what members it contains, you can use TRttiContext, which has a GetType method that returns an instance of the TRttiType reference, which has methods that let you inspect a given type and iterate through all its members if it is a class.

In our documentation attribute example, we can use RTTI to retrieve documentation URLs for the type itself and for its methods. Refer to the following code snippet:

uses RTTI, uDocAttribute, uMySuperClass; 
 
procedure TFormDemo.Button1Click(Sender: TObject); 
var 
  ctx: TRttiContext; 
  t: TRttiType; 
  m: TRttiMethod; 
  a: TCustomAttribute; 
begin 
  ClearLog; 
 
  ctx := TRttiContext.Create; 
  try 
    t := ctx.GetType(TMySuperClass); 
 
    for a in t.GetAttributes do 
          if a is DocAttribute then 
            Log(Format('Type = %s; Attribute = %s, URL = %s', 
              [TMySuperClass.ClassName, a.ClassName, DocAttribute(a).URL])); 
 
    for m in t.GetMethods do 
      for a in m.GetAttributes do 
        if a is DocAttribute then 
          Log(Format('Type = %s; Method = %s; Attribute = %s, URL = %s', 
            [TMySuperClass.ClassName, m.Name, a.ClassName, DocAttribute(a).URL])); 
 
  finally 
    ctx.Free; 
  end; 
end; 

The RTTI context object owns all the intermediate objects that represent different class members such as TRttiMethod or TRttiAttribute.

主站蜘蛛池模板: 克山县| 吴江市| 贵溪市| 长宁县| 齐河县| 敦化市| 杭锦后旗| 宜春市| 南昌市| 中阳县| 宁明县| 南平市| 绥滨县| 海丰县| 崇义县| 华宁县| 湘西| 九寨沟县| 西丰县| 大埔县| 嘉义县| 宝山区| 许昌县| 民勤县| 康保县| 建瓯市| 屏南县| 县级市| 都匀市| 永平县| 邯郸市| 星座| 监利县| 江孜县| 龙门县| 扶余县| 马公市| 昌平区| 阿拉尔市| 民乐县| 樟树市|