2009年9月5日土曜日

Tem Japanのソースを移植してみる(RTTI)

Team JapanブログのDelphi2010のRTTI機能に関するポストのソースを
Delphi Prismで記述してみた。

以下ソース

  1. method MainForm.BuildSql(obj : System.Object) : String;  
  2. var  
  3.   FldList : String;  
  4.   ValList : String;  
  5.   t : System.Type;  
  6.   PropArry : Array of PropertyInfo;  
  7.   pv : Object;  
  8.   
  9. begin  
  10.      
  11.   //渡された型を取り出して  
  12.   t := obj.GetType();  
  13.   
  14.   //プロパティの一覧を取得する  
  15.   PropArry := t.GetProperties();  
  16.    
  17.   //全てのフィールド(プロパティ)を操作してInsert分を作成  
  18.   FldList := '';  
  19.   ValList := '';  
  20.   for each Prop : PropertyInfo in PropArry do  
  21.   begin  
  22.       FldList := FldList  + Prop.Name + ',';  
  23.       pv := Prop.GetValue(obj, nil);  
  24.       //Value句 文字列は''で囲  
  25.       if (pv.GetType().Name = 'String'then  
  26.       begin  
  27.         ValList := ValList + ''''+ pv.ToString() + ''',';  
  28.       end  
  29.       else  
  30.       begin  
  31.           ValList := ValList + pv.ToString() + ",";  
  32.       end;  
  33.   
  34.   end;  
  35.   
  36.   Var Sb := new System.Text.StringBuilder();  
  37.   Sb.AppendLine('INSERT INTO ' + t.Name + '(' + FldList.Remove(FldList.Length - 1) + ')');  
  38.   Sb.AppendLine('Values (' + ValList.Remove(ValList.Length - 1) + ')');  
  39.   
  40.   Result := Sb.ToString();  
  41.   
  42. end;  


ちなみにC#で書くと

  1. private String BuildSQL(object o)  
  2. {  
  3.    //渡された型を取り出して  
  4.    Type t = o.GetType();  
  5.   
  6.    //プロパティの一覧を取得する  
  7.    System.Reflection.PropertyInfo[] PropArry = t.GetProperties();  
  8.   
  9.    //全てのフィールド(プロパティ)を操作してInsert分を作成  
  10.    string FldList = "";  
  11.    string ValList = "";  
  12.               
  13.    foreach (PropertyInfo Prop in PropArry)  
  14.    {  
  15.       FldList = FldList  + Prop.Name + ",";  
  16.       Object pv = Prop.GetValue(o, null);  
  17.                   
  18.       //Value句 文字列は''で囲  
  19.       if (pv.GetType().Name == "String")  
  20.       {  
  21.          ValList = ValList + "'" + pv.ToString() + "',";  
  22.       }  
  23.       else  
  24.       {  
  25.          ValList = ValList + pv.ToString() + ",";  
  26.       }  
  27.    }  
  28.   
  29.    StringBuilder Sb = new StringBuilder();  
  30.    Sb.AppendLine("INSERT INTO " + t.Name + "(" + FldList.Remove(FldList.Length - 1) + ")");  
  31.    Sb.AppendLine("Values (" + ValList.Remove(ValList.Length - 1) + ")");  
  32.   
  33.    return (Sb.ToString());  
  34.   
  35. }  

こんな感じかな

0 件のコメント: