D2010 New RTTI 妙解 Xml DataBinding

2023-12-09 22:32

本文主要是介绍D2010 New RTTI 妙解 Xml DataBinding,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Xml DataBinding最大的优点是,用接口和类替代了复杂繁琐的XML节点。一般使用当然没有问题,无非是XML层层的节点看作接口与接口的层级关系。但是,如果你想做一个通用的动态访问XML绑定接口类,问题就凸显麻烦了。由于TXMLDocument基于Interface机制,在生成的Xml DataBinding的Pas文件中,接口反而成了主导的访问入口,而具体的实体类,没有暴露属性,只是在protected实现了 Get 和Set 属性方法。

这种过渡的设计,导致了TypInfo单元里的RTTI也无法访问到具体的熟悉(因为没有属性嘛),而TypInfo的RTTI机制根本不能用于Interface。虽然可以参考 Web Service的接口机制,但其获取参数和赋值方式比较繁琐。万幸的是,D2010的的New RTTI落入人间,我们可以利用New RTTI做一个通用的访问XML绑定类,然后编译成DLL,这样一来,Delphi的各个版本也享受到New RTTI的好处。

姑且放下Xml DataBinding,我们先看看一段递归遍历接口的函数:

use Rtti;

    /// <summary>
    /// 递归接口方法
    /// </summary>
    /// <param name="typ">实体类的类型信息</param>
    /// <param name="Level">层级数</param>

procedure TForm5.GetMethods(typ: TRttiType; const Level: Integer);
var
   m:TRttiMethod;
   Intf:IInterface;
begin
    for m in typ.GetMethods do
    begin
      if (Pos('GET_',UpperCase(M.Name))=1) or
          (Pos('GET_',UpperCase(M.Name))=1) then // Xml DataBinding 的属性方法默认以 "Get_"打头
      Begin
        mmo1.Lines.Add(PrintSpace(Level)+ m.Name); //PrintSpace打印空格函数,4个空格为一个层级
      End;
      if (m.ReturnType<>nil) and (m.ReturnType.TypeKind = tkInterface) then
      begin
        GetMethods(m.ReturnType,Level+1);
      end;
    end;
end;

    /// <summary>
    /// 打印空格函数
    /// </summary>
    /// <param name="Count"></param>
    /// <returns></returns>

function TForm5.PrintSpace(const Count:Integer):WideString;
    var
      i:Integer;
    begin
      Result := '';
      for i := 0 to Count do
      begin
        Result := Result + '    ';
      end;
    end;

 

调用示例:

procedure TForm5.btn1Click(Sender: TObject);
var
oml:IXMLOML_O21Type;
oml2:TXMLOML_O21Type;
typ:TRttiType;
p:TRttiProperty;
m:TRttiMethod;
begin
oml := LoadOML_O21('OML_O21.xml');//装载XML
oml2 := oml.GetInstance as TXMLOML_O21Type; //为了方便访问类的实例,稍微修改了Xml Binding单元

mmo1.Clear;
mmo1.Lines.Add('OML');
   typ := TRttiContext.Create.GetType(TXMLOML_O21Type);//获取类的信息
   GetMethods(typ,1);//递归打印
end;

效果图:


这篇关于D2010 New RTTI 妙解 Xml DataBinding的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/475299

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

mybatis的mapper对应的xml写法及配置详解

《mybatis的mapper对应的xml写法及配置详解》这篇文章给大家介绍mybatis的mapper对应的xml写法及配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录前置mapper 对应 XML 基础配置mapper 对应 xml 复杂配置Mapper 中的相

java中XML的使用全过程

《java中XML的使用全过程》:本文主要介绍java中XML的使用全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录什么是XML特点XML作用XML的编写语法基本语法特殊字符编写约束XML的书写格式DTD文档schema文档解析XML的方法​​DOM解析XM

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过