日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

<< 過去

未来 >>

C#で動的型なんて流行らないと思うけど

なんかC# 4.0なんて考えてるらしい。動的型って…
IronPythonで開発してて思ったが、.NET Frameworkのライブラリは複雑すぎる。
System.Drawing.SizeとSystem.Drawing.Pointを使い分ける意味がわからない。
別に大きさ2のタプルでもいいじゃないか? と思わんこともない。
そういう都合を考えると、コンパイル時確認していただける仕組みは便利なんですよ。
そしてVisual Studioもそのように設計されている。
C# 3.0で型推論のvarが導入されたけど、あれは匿名型を使うときに必要だからですね。
var foo=new {first="Taro",last="Yamada"};
この無名の型の名を知らないから、varというキーワードを使うと。
それ以外にも使い道はあれど、あまり意味はないでしょう。
もっとも動的型導入の理由というのはJavaScriptとの連携とかいうのもあるそうだが。
.NET Frameworkのリフレクションの力でどの程度できるか試してみた。
といっても当然のことを書いてるだけですが…
  public static class DynamicWorld {
static public object call(this object self, string name, params object[] args) {
return self.GetType().GetMethod(name, Type.GetTypeArray(args)).Invoke(self, args);
}
static public object prop(this object self,string name) {
return self.GetType().GetProperty(name).GetValue(self, null); ;
}
static public void prop(this object self, string name, object value) {
self.GetType().GetProperty(name).SetValue(self, value, null);
}
static public object newobj(this string type, params object[] args) {
return Type.GetType(type).GetConstructor(Type.GetTypeArray(args)).Invoke(args);
}
static public object callstat(this string type, string name, params object[] args) {
return Type.GetType(type).GetMethod(name, Type.GetTypeArray(args)).Invoke(null, args);
}
}
未だC# 3.0をまともに使ってるわけではないが、これはC# 3.0が前提。
これ拡張メソッドなのよね。
sb.prop("Length", 0);
DynamicWorld.prop(sb,"Length",0);
下のように表記すべきを上のように簡略化できると。
とりあえずインスタンスのメソッドとプロパティにだけ対応させてみた。
本当はインデクサとかにも対応できるのだがかなりめんどくさいので。
IronPythonも結局こういうものの固まりだと思う。
さて、試しに全部これでプログラム書いてみた。
object sr="System.IO.StreamReader".newobj(@"C:\test.txt");
object sb="System.Text.StringBuilder".newobj();
sb.prop("Length", 0);
while (!(bool)sr.prop("EndOfStream")) {
sb.call("AppendLine", sr.call("ReadLine").call("Trim").call("PadRight", 20, '_'));
}
sr.call("Dispose");
"System.Console".callstat("Write",sb);
"System.Console".callstat("ReadKey", false);
拡張メソッドと可変長引数のおかげでそれなりに違和感なく使えます。
ただ、条件はbool型だろとかいうので、型変換が必要だったりというのはある。
しかしこれだけで動的に呼び出しているのです。
試しに、どっか大文字と小文字を入れ替えてみる。
コンパイルは通るものの、動かすとどっかで例外が出る。
これが動的に呼び出している証拠です。
作ってみて言うのもあれだが、あんまり使い道は思いつきませんけどね。
ただ割と簡潔に書けていますね。
.NET Frameworkのリフレクションの強さの証明と言えないこともない。
本当になんでもありの環境ですね。
それにしてもC# 4.0か…けど.NET Frameworkは2.0系のままなんだろうな。
だから動的型使ったソースコードも上に書いたようにされるのかな?
まぁそんな風に思わんこともない。
Author : Hidemaro
Date : 2008/11/23(Sun) 23:10
コンピュータ・インターネット | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools