procedure TXmlReflector.LoadFromXmlNode(ANode:IXMLNode);
var
  Context: TRttiContext;
  rttiType,tmpType: TRttiType;
  Prop: TRttiProperty;
  value:TValue;
  AType:PTypeInfo;
  tmpNode,subNode:IXMLNode;
  AList:TList;
  Obj:TObject;
begin
  Context := TRttiContext.Create;
  try
    rttiType := Context.GetType(ClassType);
    if ANode.HasChildNodes then
    begin
      tmpNode:=ANode.ChildNodes.First;
      while Assigned(tmpNode) do
      begin
        prop:=rttiType.GetProperty(tmpNode.NodeName);
        if tmpNode.IsTextElement then
        begin
          if Prop.PropertyType.TypeKind in [tkInteger,tkInt64] then
          begin
            AType:=TypeInfo(Int64);
            value:=TValue.FromOrdinal(AType,StrToInt64Def(tmpNode.Text,0));
          end else if Prop.PropertyType.TypeKind in [tkChar,tkString,tkWChar,tkLString,tkWString,tkUString,tkVariant] then
          begin
            value:=tmpNode.Text;
          end else if Prop.PropertyType.TypeKind in [tkFloat] then//日期,浮点数
          begin
            value:=StrToFloatDef(tmpNode.Text,0.0);
          end;
          Prop.SetValue(Self,value);
        end else //TList
        begin
          if (tmpNode.HasChildNodes)and(prop.PropertyType.Name='TList') then
          begin
            AList:=TList.Create;
            value:=AList;
            Prop.SetValue(Self,value);
            subNode:=tmpNode.ChildNodes.First;
            while Assigned(subNode) do
            begin
              //谁帮我搞定这里,我现在只能用一个TDictionary来实现类的创建
              Obj:=TypeDict.Items[subNode.NodeName].Create;
              AList.Add(Obj);
              TXmlReflector(Obj).LoadFromXmlNode(subNode);
              subNode:=subNode.NextSibling;
            end;          end;
        end;
        tmpNode:=tmpNode.NextSibling;
      end;
    end;
  finally
    Context.Free;
  end;
end;

解决方案 »

  1.   

    for Attri in Prop.GetAttributes do
              begin
                if Attri is TXmlAttri then
                begin
                  tmpClass:=TXmlAttri(Attri).ClassT;
                end;
              end;
              if (tmpNode.HasChildNodes)and(prop.PropertyType.Name='TList') then
              begin
                AList:=TList.Create;
                value:=AList;
                Prop.SetValue(Self,value);
                subNode:=tmpNode.ChildNodes.First;
                while Assigned(subNode) do
                begin
                  Obj:=tmpClass.Create;
                  AList.Add(Obj);
                  TXmlReflector(Obj).LoadFromXmlNode(subNode);
                  subNode:=subNode.NextSibling;
                end;
              end else
              begin
                Obj:=tmpClass.Create;
                value:=Obj;
                Prop.SetValue(Self,value);
                TXmlReflector(Obj).LoadFromXmlNode(tmpNode);
              end;
    自己搞定了,没人来吗,结贴了。
      

  2.   

    郁闷,感觉DLPHI的TValue不是很方便,还不能做到智能装换类型,是不是我用错了!!!!!