最終更新日 2024-06-21

DynamicObjectでラップするべからず

概要

C# の DynamicObject を知っている人であれば、 hm.NETの hm.Macro.Functionやhm.Macro.Statement 、あるいは、hm.Macro.Var などを
DynamicObjectなどでラップしたくなるかもしれません。

しかし、一般的な傾向としては、Visual Studio の強力な型補完や入力補完を失うだけとなり、
結果としてプラスに働きません。

DynamicObject とは...

DynamicObject型を知らない、直接classを継承して使ったことがない人もいるかと思います。

DynamicObjectとは、存在しないメソッドやプロパティ、呼び出し方法が、あたかも存在するかのように振る舞うことができるオブジェクトです。
簡単に説明すると、以下のようなものを継承して上書き定義出来ます。
通常は全て定義するわけではなく、自分で使いたい所だけ定義します。

# メソッド名 何を定義してるか 説明
1 TryBinaryOperation d + d2 2項目の演算
2 TryConvert (Hoge)d インデックスアクセスでの値の取得
3 TryGetIndex d[0] @twitter
4 TryGetMember d.Hoge フィールド値の取得
5 TryInvoke d() 該当オブジェクト自体に( )を使った関数的な評価の仕方に見立てた実行
6 TryInvokeMember d.Hoge(...) メンバー関数を呼び出した時。引数の内容も分析したりそのまま別へと委譲出来る
7 TrySetIndex d[0] = hoge インデックスアクセスでの値の設定
8 TrySetMember d.Hoge = hoge フィールド値への値の設定
9 TryUnaryOperation -dとかd++ 単項で-や++など単項

例えば、TryInvokeMember の振る舞いを上書き定義すると...