主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Boo: XAML(XML)をコードに変換する

                
http://elicon.blog57.fc2.com/blog-entry-272.html
GUIを記述したXAMLをBooコードにコンバートするコードを書いた。まだプロトタイプであるし、リファクタリングもせねばならんけど、動作するものができた。
コンバートで吐き出されるBooのコードに不正がないか確認する機構を持たせるために、メソッドやプロパティをかなり調べまわした。後学になりそうなものが結構得られた。C#と書き方はあまり変わらないため、流用ができそうだ。
******

コンバートコードの流れとして、XAMLのエレメントの名前を得て、その名前に対応したクラスがSystem.Windows名前空間以下にあるか確認。なければエラー。あればインスタンスを作成して、XAMLからアトリビュートを読み込んでそれがプロパティとして存在するか確認。存在すれば付加していく。アトリビュートの付加が終わったら、XAMLの次のエレメントに移って、エレメントの名前の処理をする。これをノード間の連結をしながら繰り返していく。


まずエレメントの名前から、その名前と同じクラスがあるかを確認する。要は文字列でクラスを指定して、そのインスタンスが作れればいい。以下のように。戻り値の型が"System.Runtime.Remoting.ObjectHandle"という型になっていて、Unwrapメソッドを呼んでラップの解除をしなければならない。
参考:http://msdn.microsoft.com/ja-jp/library/d133hta4(v=vs.100).aspx
try:
type = Activator.CreateInstance("PresentationFramework", "System.Windows." + reader.Name).Unwrap().GetType()
except e:
print e
try:
type = Activator.CreateInstance("PresentationFramework", "System.Windows.Controls." + reader.Name).Unwrap().GetType()
except e:
raise e



上記のコードで変数typeにインスタンスを作成できた。そのインスタンスが持つプロパティを文字列で指定して確認するにはType型のメソッドを使う。以下のように。GetProperty以外にもGetEventやGetMethod、一覧を取得するGetPropertiesなどがある。
if type.GetProperty(str):
p as PropertyInfo = type.GetProperty(str)



イベントにはデリゲートを渡してやればいいと決まっている。だけどプロパティではそうはいかない。任意の列挙型からの値、文字列型やDouble型や任意のクラスのインスタンスなどプロパティの欲する値の型はそれぞれである。そんなプロパティに渡す値を渡すとき、そこにどういう型を渡せばいいかコード上で判別してほしい。それは以下のように。
propertyType = p.PropertyType
if propertyType == System.Double:
code = "{0} = {1}\n" %(reader.Name, reader.Value)
elif propertyType == System.String:
code = "{0} = '{1}'\n" %(reader.Name, reader.Value)



あとはノード間の連結を考えながら上記の処理をループするだけ。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。