/// <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; }
/// <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); }
/// <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; }
/// <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); }
/// <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)); }
/// <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]; }
/// <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]); }
/// <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)); } }
/// <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)); }
/// <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>(); }
/// <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) { }
/// <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); }
/// <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>(); }
public DynamicAppType(AppFriend app, string name) { _app = app; _name = name; _isType = IsTypeName(_app, name, false); }
/// <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) { }
/// <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> /// タイプの名前であるか。 /// </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); } }
/// <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)); }
/// <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)); }
/// <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()); }
/// <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()); }