示例#1
0
        /// <summary>
        /// Provides dynamic resolution of method calls.
        /// To specify Async and/or OperationTypeInfo, please pass these as arguments.
        /// They can be included in any order.
        /// </summary>
        /// <param name="binder">Binder.</param>
        /// <param name="args">Arguments.</param>
        /// <param name="result">Return value.</param>
        /// <returns>Success or failure.</returns>
#else
        /// <summary>
        /// メソッド実行の自動解決です。
        /// AsyncとOperationTypeInfoを指定する場合は、引数に渡してください。
        /// その順番はどこでも構いません。
        /// </summary>
        /// <param name="binder">バインダー。</param>
        /// <param name="args">引数。</param>
        /// <param name="result">戻り値。</param>
        /// <returns>成否。</returns>
#endif
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            Async             async;
            OperationTypeInfo typeInfo;

            args   = DynamicFriendlyOperationUtility.ResolveArguments(args, out async, out typeInfo);
            result = DynamicFriendlyOperationUtility.GetFriendlyOperation(_appVar, binder.Name, async, typeInfo)(args).Dynamic();
            return(true);
        }
示例#2
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());
        }
示例#3
0
        /// <summary>
        /// メソッド実行の動的解決です。
        /// AsyncとOperationTypeInfoを指定する場合は、引数に渡してください。
        /// その順番はどこでも構いません。
        /// </summary>
        /// <param name="name">名前。</param>
        /// <param name="args">引数。</param>
        /// <returns>戻り値。</returns>
        private dynamic InvokeMember(string name, object[] args)
        {
            string nextTypeName = JointName(_name, name);

            if (IsTypeName(_app, nextTypeName, _isType))
            {
                //型名称になれば、生成する。
                return(NewAppVar(_app, nextTypeName, args));
            }
            else
            {
                //staticメソッドの呼び出し。
                Async             async;
                OperationTypeInfo typeInfo;
                args = DynamicFriendlyOperationUtility.ResolveArguments(args, out async, out typeInfo);
                return(DynamicFriendlyOperationUtility.GetFriendlyOperation(_app, nextTypeName, async, typeInfo)(args).Dynamic());
            }
        }
示例#4
0
        /// <summary>
        /// Provides dynamic resolution of set indexes.
        /// Cannot be used asynchronously.
        /// By casting AppVar, you can use the FriendlyOperation If you need asynchronous execution by all means,
        /// Please execute the method call format.
        /// Please use the (set_Item definition Set, in the object array aliases) index access method name.
        /// </summary>
        /// <param name="binder">Binder.</param>
        /// <param name="indexes">Index access argument.</param>
        /// <param name="value">Value to be set.</param>
        /// <returns>Success or failure.</returns>
#else
        /// <summary>
        /// インデックスアクセス(setter)の動的解決です。
        /// 非同期実行はできません。
        /// どうしても非同期実行が必要な場合はAppVarにキャストして、FriendlyOperationを使用するか、
        /// メソッド形式の呼び出しを実行してください。
        /// メソッド名称はインデックスアクセスの別名(配列はSet,オブジェクトでの定義はset_Item)を使用してください。
        /// </summary>
        /// <example>
        /// //非同期サンプル。
        /// dynamic array; //int[]のオブジェクトが格納されているとします。
        /// Async async = new Async();
        /// array.Set(async, 1, 100); //メソッド形式で呼び出すことが出来ます。Asyncオブジェクトを指定することが出来ます。
        /// </example>
        /// <param name="binder">バインダー。</param>
        /// <param name="indexes">インデックスアクセス引数</param>
        /// <param name="value">設定する値</param>
        /// <returns>成否。</returns>
#endif
        public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
        {
            object[] args = DynamicFriendlyOperationUtility.AddSetterValue(indexes, value);
            _appVar[GetIndexAccessOperation(indexes.Length)](args);
            return(true);
        }