Friendly、ラムダ送れるってよ
いや、ちょっとタイトルは正確さに欠けますが、ご容赦を。
今日は、驚きの発見がありました。
FriendlyユーザーのITO(仮名)さんと話していると
ITO「こんな感じでテスト書いたらいいと思うんですよね。」
石「でもこのコード、ラムダ使ってますよ。プロセス違うからラムダなんて送れるわけないじゃん。」
ITO「え?でも送れましたよ?」
石「なん…だと…!?」
こんなコードが書けたのです。
上の話の時のコードとは違うけど、つまりは以下のようなコードが書けたのです。
public void ラムダが送れた() { WindowsAppExpander.LoadAssembly(_app, GetType().Assembly); //メインウィドウのタイトルを表示 Action a1 = () => MessageBox.Show(Process.GetCurrentProcess().MainWindowTitle); //Actionを転送 var a2 = _app.Copy(a1); //対象プロセス内で実行 a2.Invoke(); }
???なんで?
作者は想定外ですw
Friendlyで送れるのは以下のもの
①シリアライズ可能なオブジェクト
②AppVar
③DynamicAppVar
④IAppVarOwner
②③④ではありえないので、
Actionは①ってことになります。
つまりDelegateはシリアライズ可能なこともある
ということですね。
知らんかった。
「可能なこともある」
ってボンヤリしてますね。
以下ちょっと実験しましたけど、可能/不可能の境界線はまだ調べられてないです。
public void シリアライズ可能() { var formatter = new BinaryFormatter(); using (var stream = new MemoryStream()) { //これはシリアライズできた Action a1 = () => MessageBox.Show(""); formatter.Serialize(stream, a1); //これは無理 string text = ""; Action a2 = () => MessageBox.Show(text); formatter.Serialize(stream, a2); } }
何か面白い機能追加できそう!
とにかく可能性が広がりました!
なんか面白機能をFriendlyの基本部分に追加できそうです。
ITOさん、センキューで~す(チャラい
そしてこんな面白いことができるFriendlyのハンズオンがあります。
宣伝w。残席まだあります。ご参加お待ちしております!
東京会場SHIFT様(9/19)madoguchi100.connpass.com
大阪会場ベリサーブ様(9/24)vshtc.doorkeeper.jp