Пример #1
0
 /// <summary>
 /// タイプ名称か。
 /// </summary>
 /// <param name="app">アプリケーション操作クラス。</param>
 /// <param name="name">名前。</param>
 /// <param name="cacheNotType">タイプ名称でなくてもキャッシュするか。</param>
 /// <returns>タイプ名称か。</returns>
 internal bool IsTypeName(AppFriend app, string name, bool cacheNotType)
 {
     if (NameSpace.ContainsKey(name))
     {
         return false;
     }
     bool isType = false;
     if (Type.TryGetValue(name, out isType))
     {
         return isType;
     }
     if ((bool)app[typeof(object), "ReferenceEquals"](_typeFinder["GetType"](name), null).Core)
     {
         if (cacheNotType)
         {
             Type.Add(name, false);
         }
         return false;
     }
     Type.Add(name, true);
     int index = name.LastIndexOf('.');
     if (index != -1)
     {
         string nameSpace = name.Substring(0, index);
         NameSpace.Remove(nameSpace);
         NameSpace.Add(nameSpace, true);
     }
     return true;
 }
Пример #2
0
        /// <summary>
        /// タイプ名称か。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <param name="name">名前。</param>
        /// <param name="cacheNotType">タイプ名称でなくてもキャッシュするか。</param>
        /// <returns>タイプ名称か。</returns>
        internal bool IsTypeName(AppFriend app, string name, bool cacheNotType)
        {
            if (NameSpace.ContainsKey(name))
            {
                return(false);
            }
            bool isType = false;

            if (Type.TryGetValue(name, out isType))
            {
                return(isType);
            }
            if ((bool)app[typeof(object), "ReferenceEquals"](_typeFinder["GetType"](name), null).Core)
            {
                if (cacheNotType)
                {
                    Type.Add(name, false);
                }
                return(false);
            }
            Type.Add(name, true);
            int index = name.LastIndexOf('.');

            if (index != -1)
            {
                string nameSpace = name.Substring(0, index);
                NameSpace.Remove(nameSpace);
                NameSpace.Add(nameSpace, true);
            }
            return(true);
        }
Пример #3
0
        /// <summary>
        /// コンストラクタ。
        /// </summary>
        /// <param name="app">操作対象アプリ。</param>
        public WpfVisualTree(AppFriend app)
        {
            ArgumentValidation.IsNotNull(app, nameof(app));

            this.App = app;
            this.VisualTreeHelper = app.Type().System.Windows.Media.VisualTreeHelper;
        }
Пример #4
0
        /// <summary>
        /// Dynamically resolves get access to properties and fields.
        /// Cannot be used asynchorously.
        /// If you need asynchronous access, please cast the object to an AppVar
        /// and use a FriendlyOperation, or call it in the form of a method by specifying a
        /// method name equal to the property name.
        /// </summary>
        /// <param name="binder">Binder.</param>
        /// <param name="result">Retrieved result.</param>
        /// <returns>Success or failure.</returns>
#else
        /// <summary>
        /// プロパティーへのアクセス(getter)の動的解決です。
        /// 非同期実行はできません。
        /// どうしても非同期実行が必要な場合はAppVarにキャストして、FriendlyOperationを使用するか、
        /// メソッド形式の呼び出しを実行してください。
        /// メソッド名称はプロパティー名称と同一です。
        /// </summary>
        /// <param name="binder">バインダー。</param>
        /// <param name="result">取得結果。</param>
        /// <returns>成否。</returns>
#endif
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            string nextName = JointName(_name, binder.Name);

            if (!_isType ||                          //現在の名前が型でないのなら、つなげる
                IsTypeName(_app, nextName, _isType)) //現在の名前が型でも、つなげた名前が型になるなら、つなげる。
            {
                dynamic next = new DynamicAppType(_app, nextName);
                result = next;
            }
            else
            {
                //staticなgetter呼び出し。
                result = _app[nextName]().Dynamic();
            }
            return(true);
        }
        static AppVar AdjustCollectionButton <T>(IWPFDependencyObjectCollection <T> collection, AppFriend app) where T : Button
        {
            //.net3.0対応
            var adjustCollection = app.Dim(new NewInfo <List <Button> >());

            app[typeof(CastUtility), "CastList"](collection, adjustCollection);
            return(adjustCollection);
        }
Пример #6
0
        /// <summary>
        /// Helper method for generating a DynamicAppType for the specified type.
        /// </summary>
        /// <example>
        /// dynamic controlType = app.Type(typeof(Control));
        /// </example>
        /// <param name="app">Application manipulation object.</param>
        /// <param name="type">Type.</param>
        /// <returns>DynamicAppType.</returns>
#else
        /// <summary>
        /// 指定の名前のDynamicAppTypeを生成するヘルパメソッドです。
        /// </summary>
        /// <example>
        /// ・System.Windows.Forms.ControlクラスのDynamicAppTypeを作成する場合
        ///  dynamic controlType = app.Type(typeof(Control));
        /// </example>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <param name="type">タイプ。</param>
        /// <returns>DynamicAppType。</returns>
#endif
        public static dynamic Type(this AppFriend app, Type type)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }
            return(new DynamicAppType(app, type.FullName));
        }
Пример #7
0
        /// <summary>
        /// 対象アプリケーション内にインスタンス生成。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <param name="typeFullName">生成する型のフルネーム。</param>
        /// <param name="args">引数。</param>
        /// <returns>生成したインスタンスを操作するためのDynamicAppVar。</returns>
        private static dynamic NewAppVar(AppFriend app, string typeFullName, object[] args)
        {
            Async             async;
            OperationTypeInfo typeInfo;

            args = DynamicFriendlyOperationUtility.ResolveArguments(args, out async, out typeInfo);
            if (async != null)
            {
                throw new FriendlyOperationException(Resources.ErrorInstanceCreateCantUseAsync);
            }
            return((typeInfo == null) ? app.Dim(new NewInfo(typeFullName, args)).Dynamic() :
                   app.Dim(new NewInfo(typeFullName, args), typeInfo).Dynamic());
        }
 /// <summary>
 /// FriendlyOperationを取得。
 /// </summary>
 /// <param name="target">対象。</param>
 /// <param name="name">操作名称。</param>
 /// <param name="async">非同期実行オブジェクト。</param>
 /// <param name="typeInfo">操作タイプ情報。</param>
 /// <returns>FriendlyOperation。</returns>
 internal static FriendlyOperation GetFriendlyOperation(AppFriend target, string name, Async async, OperationTypeInfo typeInfo)
 {
     if (async != null && typeInfo != null)
     {
         return target[name, typeInfo, async];
     }
     else if (async != null)
     {
         return target[name, async];
     }
     else if (typeInfo != null)
     {
         return target[name, typeInfo];
     }
     return target[name];
 }
Пример #9
0
 /// <summary>
 /// FriendlyOperationを取得。
 /// </summary>
 /// <param name="target">対象。</param>
 /// <param name="name">操作名称。</param>
 /// <param name="async">非同期実行オブジェクト。</param>
 /// <param name="typeInfo">操作タイプ情報。</param>
 /// <returns>FriendlyOperation。</returns>
 internal static FriendlyOperation GetFriendlyOperation(AppFriend target, string name, Async async, OperationTypeInfo typeInfo)
 {
     if (async != null && typeInfo != null)
     {
         return(target[name, typeInfo, async]);
     }
     else if (async != null)
     {
         return(target[name, async]);
     }
     else if (typeInfo != null)
     {
         return(target[name, typeInfo]);
     }
     return(target[name]);
 }
Пример #10
0
        /// <summary>
        /// タイプの名前であるか。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <param name="name">名前。</param>
        /// <param name="cacheNotType">タイプでなくてもキャッシュする。</param>
        /// <returns>タイプの名前であるか。</returns>
        private static bool IsTypeName(AppFriend app, string name, bool cacheNotType)
        {
            if (string.IsNullOrEmpty(name))
            {
                return(false);
            }

            //初回登録時にマルチスレッドでアクセスされた場合
            //初回のキャッシュ登録が無駄になるが、許容する
            object typeCache;

            if (!app.TryGetAppControlInfo(TypeCacheKey, out typeCache))
            {
                typeCache = new TypeChahe(app);
                app.AddAppControlInfo(TypeCacheKey, typeCache);
            }
            lock (typeCache)
            {
                return(((TypeChahe)typeCache).IsTypeName(app, name, cacheNotType));
            }
        }
Пример #11
0
        /// <summary>
        /// Helper method for generating a DynamicAppType for the specified type.
        /// </summary>
        /// <example>
        /// dynamic controlType = app.Type("System.Windows.Forms.Control");
        /// </example>
        /// <param name="app">Application manipulation object.</param>
        /// <param name="name">Name space or TypeFullName.</param>
        /// <returns>DynamicAppType.</returns>
#else
        /// <summary>
        /// 指定の名前のDynamicAppTypeを生成するヘルパメソッドです。
        /// </summary>
        /// <example>
        /// ・System.Windows.Forms.ControlクラスのDynamicAppTypeを作成する場合
        ///  dynamic controlType = app.Type("System.Windows.Forms.Control");
        /// </example>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <param name="name">ネームスペースもしくはタイプフルネーム。</param>
        /// <returns>DynamicAppType。</returns>
#endif
        public static dynamic Type(this AppFriend app, string name)
        {
            return(new DynamicAppType(app, name));
        }
Пример #12
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="app">アプリケーション操作クラス</param>
 internal TypeChahe(AppFriend app)
 {
     _typeFinder = app.Dim(new NewInfo("Codeer.Friendly.DotNetExecutor.TypeFinder"));
     NameSpace   = new Dictionary <string, bool>();
     Type        = new Dictionary <string, bool>();
 }
Пример #13
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="app">Application manipulation object.</param>
#else
        /// <summary>
        /// コンストラクタ。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>
#endif
        public DynamicAppType(AppFriend app) : this(app, string.Empty)
        {
        }
Пример #14
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="app">Application manipulation object.</param>
        /// <param name="name">Type full name.</param>
#else
        /// <summary>
        /// コンストラクタ。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <param name="name">型名称。</param>
#endif
        public DynamicAppType(AppFriend app, string name)
        {
            _app    = app;
            _name   = name;
            _isType = IsTypeName(_app, name, false);
        }
Пример #15
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="app">アプリケーション操作クラス</param>
 internal TypeChahe(AppFriend app)
 {
     _typeFinder = app.Dim(new NewInfo("Codeer.Friendly.DotNetExecutor.TypeFinder"));
     NameSpace = new Dictionary<string, bool>();
     Type = new Dictionary<string, bool>();
 }
Пример #16
0
 public DynamicAppType(AppFriend app, string name)
 {
     _app = app;
     _name = name;
     _isType = IsTypeName(_app, name, false);
 }
Пример #17
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="app">Application manipulation object.</param>
        /// <summary>
        /// コンストラクタ。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>

        #else

        #endif

        #region Constructors

        public DynamicAppType(AppFriend app)
            : this(app, string.Empty)
        {
        }
Пример #18
0
 /// <summary>
 /// 対象アプリケーション内にインスタンス生成。
 /// </summary>
 /// <param name="app">アプリケーション操作クラス。</param>
 /// <param name="typeFullName">生成する型のフルネーム。</param>
 /// <param name="args">引数。</param>
 /// <returns>生成したインスタンスを操作するためのDynamicAppVar。</returns>
 private static dynamic NewAppVar(AppFriend app, string typeFullName, object[] args)
 {
     Async async;
     OperationTypeInfo typeInfo;
     args = DynamicFriendlyOperationUtility.ResolveArguments(args, out async, out typeInfo);
     if (async != null)
     {
         throw new FriendlyOperationException(Resources.ErrorInstanceCreateCantUseAsync);
     }
     return (typeInfo == null) ? app.Dim(new NewInfo(typeFullName, args)).Dynamic() :
                                     app.Dim(new NewInfo(typeFullName, args), typeInfo).Dynamic();
 }
Пример #19
0
        /// <summary>
        /// タイプの名前であるか。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <param name="name">名前。</param>
        /// <param name="cacheNotType">タイプでなくてもキャッシュする。</param>
        /// <returns>タイプの名前であるか。</returns>
        private static bool IsTypeName(AppFriend app, string name, bool cacheNotType)
        {
            if (string.IsNullOrEmpty(name))
            {
                return false;
            }

            //初回登録時にマルチスレッドでアクセスされた場合
            //初回のキャッシュ登録が無駄になるが、許容する
            object typeCache;
            if (!app.TryGetAppControlInfo(TypeCacheKey, out typeCache))
            {
                typeCache = new TypeChahe(app);
                app.AddAppControlInfo(TypeCacheKey, typeCache);
            }
            lock (typeCache)
            {
                return ((TypeChahe)typeCache).IsTypeName(app, name, cacheNotType);
            }
        }
Пример #20
0
        /// <summary>
        /// Helper method to generate an empty DynamicAppType.
        /// You should follow a call to Type() with the fully qualified namespace and classname of the type you want to access.
        /// </summary>
        /// <example>
        /// app.Type().System.Windows.Forms.Control.FromHandle(handle);
        /// </example>
        /// <param name="app">Application manipulation object.</param>
        /// <returns>DynamicAppType。</returns>
#else
        /// <summary>
        /// 空のDynamicAppTypeを生成するヘルパメソッドです。
        /// この後にネームスペースとタイプを続けてください。
        /// </summary>
        /// <example>
        /// ・System.Windows.Forms.ControlクラスのDynamicAppTypeを作成する場合
        ///  dynamic controlType = app.Type().System.Windows.Forms.Control;
        /// </example>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <returns>DynamicAppType。</returns>
#endif
        public static dynamic Type(this AppFriend app)
        {
            return(new DynamicAppType(app));
        }
Пример #21
0
        /// <summary>
        /// Helper method for generating a DynamicAppType for the specified type.
        /// </summary>
        /// <example>
        /// dynamic controlType = app.Type<Control>();
        /// </example>
        /// <typeparam name="T">Type.</typeparam>
        /// <param name="app">Application manipulation object.</param>
        /// <returns>DynamicAppType.</returns>
#else
        /// <summary>
        /// 指定のタイプのDynamicAppTypeを生成するためのヘルパメソッドです。
        /// </summary>
        /// <example>
        /// ・System.Windows.Forms.ControlクラスのDynamicAppTypeを作成する場合
        ///  dynamic controlType = app.Type<Control>();
        /// </example>
        /// <typeparam name="T">タイプ。</typeparam>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <returns>DynamicAppType。</returns>
#endif
        public static dynamic Type <T>(this AppFriend app)
        {
            return(new DynamicAppType(app, typeof(T).FullName));
        }
Пример #22
0
        /// <summary>
        /// Declares a null variable in the target application and returns a DynamicAppVar to access it.
        /// </summary>
        /// <param name="app">Application manipulation object.</param>
        /// <returns>DynamicAppVar.</returns>
#else
        /// <summary>
        /// テスト対象アプリケーション内にnullの変数を宣言し、その変数を操作するDynamicAppVarを返します。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <returns>DynamicAppVar。</returns>
#endif
        public static dynamic Null(this AppFriend app)
        {
            return(app.Dim().Dynamic());
        }
Пример #23
0
        /// <summary>
        /// Copies indicated object into the target application and returns a DynamicAppVar to access it.
        /// </summary>
        /// <param name="app">Application manipulation object.</param>
        /// <param name="obj">Object to be sent (must be serializable, AppVar, or DynamicAppVar).</param>
        /// <returns>DynamicAppVar.</returns>
#else
        /// <summary>
        /// テスト対象アプリケーション内に指定のオブジェクトをコピーし、その変数を操作するDynamicAppVarを返します。
        /// </summary>
        /// <param name="app">アプリケーション操作クラス。</param>
        /// <param name="obj">初期化オブジェクト(シリアライズ可能なオブジェクトもしくはAppVar、DynamicAppVarであること)。</param>
        /// <returns>DynamicAppVar。</returns>
#endif
        public static dynamic Copy(this AppFriend app, object obj)
        {
            return(app.Dim(obj).Dynamic());
        }