2009年9月5日土曜日

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

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

以下ソース


method MainForm.BuildSql(obj : System.Object) : String;
var
FldList : String;
ValList : String;
t : System.Type;
PropArry : Array of PropertyInfo;
pv : Object;

begin

//渡された型を取り出して
t := obj.GetType();

//プロパティの一覧を取得する
PropArry := t.GetProperties();

//全てのフィールド(プロパティ)を操作してInsert分を作成
FldList := '';
ValList := '';
for each Prop : PropertyInfo in PropArry do
begin
FldList := FldList + Prop.Name + ',';
pv := Prop.GetValue(obj, nil);
//Value句 文字列は''で囲
if (pv.GetType().Name = 'String') then
begin
ValList := ValList + ''''+ pv.ToString() + ''',';
end
else
begin
ValList := ValList + pv.ToString() + ",";
end;

end;

Var Sb := new System.Text.StringBuilder();
Sb.AppendLine('INSERT INTO ' + t.Name + '(' + FldList.Remove(FldList.Length - 1) + ')');
Sb.AppendLine('Values (' + ValList.Remove(ValList.Length - 1) + ')');

Result := Sb.ToString();

end;



ちなみにC#で書くと



private String BuildSQL(object o)
{
//渡された型を取り出して
Type t = o.GetType();

//プロパティの一覧を取得する
System.Reflection.PropertyInfo[] PropArry = t.GetProperties();

//全てのフィールド(プロパティ)を操作してInsert分を作成
string FldList = "";
string ValList = "";

foreach (PropertyInfo Prop in PropArry)
{
FldList = FldList + Prop.Name + ",";
Object pv = Prop.GetValue(o, null);

//Value句 文字列は''で囲
if (pv.GetType().Name == "String")
{
ValList = ValList + "'" + pv.ToString() + "',";
}
else
{
ValList = ValList + pv.ToString() + ",";
}
}

StringBuilder Sb = new StringBuilder();
Sb.AppendLine("INSERT INTO " + t.Name + "(" + FldList.Remove(FldList.Length - 1) + ")");
Sb.AppendLine("Values (" + ValList.Remove(ValList.Length - 1) + ")");

return (Sb.ToString());

}


こんな感じかな