概要‎ > ‎

Codeer.Friendly.Dynamic

Codeer.Friendly.Dynamicは.NetFrameworkのdynamicと拡張メソッドを使って、
Friendlyの様々な処理呼び出しを直観的に記述するためのライブラリです。
dynamicを使っているため、テストコードは.NetFramework4.0以上で記述する必要があります。
プロダクトコードは、バージョンは何でも問題ありません。(2.0でもネイティブでもOKです。)

ソースコードも公開しています。
また、テストコードも同梱されておりますので、そちらもサンプルとしてご利用ください。

フィードバック大歓迎です。
Friendly*Codeer.co.jp (*を@に変更して送信してください。)
よろしくお願いします。


Codeer.Friendlyは、他プロセスを操作するので、処理は実行時に解決する必要があり、文字列ベースで処理を指定していました。
また、その処理呼び出し方法(FriendlyOperation)も、一般的なメソッド、プロパティー呼び出しとは異なるため、直観的ではありませんでした。
以下のようなコードになります。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Codeer.Friendly.Windows;
using System.Diagnostics;
using Codeer.Friendly.Windows.Grasp;
using System.Collections.Generic;

namespace
Codeer.Friendly.Test
{
    [TestClass]
    public class Demo
    {
        WindowsAppFriend _app;
        Process _process;
 
        [TestInitialize]
        public void TestInitialize()//省略
 
        [TestCleanup]
        public void TestCleanup()//省略
 
        [TestMethod]
        public void Old()
        {
            //フォームの取得
            AppVar form = _app["System.Windows.Forms.Control.FromHandle"](_process.MainWindowHandle);
           
            //テキストの変更と取得
            form["Text"]("abc");
            string text = (string)form["Text"]().Core;
            Assert.AreEqual("abc", text);
 
            //リストを生成して、それの操作
            AppVar list = _app.Dim(new List<int>());
            list["Add"](1);
            list["[]"](0, 100);
            int value = (int)list["[]"](0).Core;
            Assert.AreEqual(100, value);
        }
    }
}


なんとか、普通のメソッド、プロパティーに近いフィーリングを出そうとしたのですが、若干無理がありました。
(インデックスアクセスのあたり特に。)

Codeer.Friendly.Dynamicを使うと、次のように変わります。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Codeer.Friendly.Windows;
using System.Diagnostics;
using Codeer.Friendly.Windows.Grasp;
using System.Collections.Generic;
using Codeer.Friendly.Dynamic;//これをusingすると拡張メソッドが有効になります。
 
namespace Codeer.Friendly.Test
{
    [
TestClass]
   
public class Demo
    {
       
WindowsAppFriend _app;
       
Process _process;

        [
TestInitialize]
       
public void TestInitialize()//省略

        [
TestCleanup]
       
public void TestCleanup()//省略

        [
TestMethod]
       
public void New()
        {
           
//フォームの取得
           
dynamic form = _app.Type().System.Windows.Forms.Control.FromHandle(_process.MainWindowHandle);

           
//テキストの変更と取得
            form.Text =
"abc";
           
string text = form.Text;
           
Assert.AreEqual("abc", text);

           
//リストを生成して、それの操作
           
dynamic list = _app.Copy(new List<int>());
            list.Add(1);
            list[0] = 100;
           
int value = list[0];
           
Assert.AreEqual(100, value);
        }
    }
}



この呼び出しを実現しているクラスは
DynamicAppVarとDynamicAppTypeです。
また、この仕組みを使いやすくするため、AppVar、AppFriendに拡張メソッドが追加されます。

現在では、このCodeer.Friendly.Dynamicを使った書き方が標準となっておりますので、
Friendlyの基本に詳細な使い方を書いております。そちらを参照お願いします。