/// <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); }
/// <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> /// メソッド実行の動的解決です。 /// 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()); } }
/// <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); }