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:开篇 - yyimen - yyimen的博客


        
        



        







        
          
            
            评论这张
          
        


          
            
               D2010 New RTTI 妙解 Xml DataBinding:开篇 - yyimen - yyimen的博客
            
            转发至微博
          
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值