private void InitializeOperationTypes() { cbBxOperationType.DataSource = OperationTypeInfo.LoadAvailableTypes(); cbBxOperationType.SelectedIndexChanged += CbBxOperationType_SelectedIndexChanged; cbBxOperationType.SelectedIndex = 0; CbBxOperationType_SelectedIndexChanged(this, null); }
/// <summary> /// 戻り値をAppVarで取得する通信。 /// </summary> /// <param name="invoker">呼び出し元。</param> /// <param name="friendlyConnector">アプリケーションとの接続者。</param> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="varAddress">変数アドレス。</param> /// <param name="typeFullName">タイプフルネーム。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> /// <returns>変数。</returns> internal static AppVar SendAndVarReceive(object invoker, IFriendlyConnector friendlyConnector, ProtocolType protocolType, OperationTypeInfo operationTypeInfo, VarAddress varAddress, string typeFullName, string operation, object[] arguments) { object value = SendAndValueReceive(invoker, friendlyConnector, protocolType, operationTypeInfo, varAddress, typeFullName, operation, arguments); VarAddress retHandle = value as VarAddress; return (retHandle == null) ? (null) : (new AppVar(friendlyConnector, retHandle)); }
/// <summary> /// 非同期実行オブジェクトと操作タイプ情報に関して引数を解決する。 /// </summary> /// <param name="srcArgs">元引数。</param> /// <param name="async">非同期実行オブジェクト。</param> /// <param name="typeInfo">操作タイプ情報。</param> /// <returns>解決した後の引数。</returns> private static object[] ResolveAsyncAndTypeInfo(object[] srcArgs, out Async async, out OperationTypeInfo typeInfo) { List <object> list = new List <object>(); async = null; typeInfo = null; foreach (object element in srcArgs) { Async checkAsync = element as Async; if (checkAsync != null) { if (async != null) { throw new FriendlyOperationException(Resources.ErrorAsyncArgument); } async = checkAsync; continue; } OperationTypeInfo checkInfo = element as OperationTypeInfo; if (checkInfo != null) { if (typeInfo != null) { throw new FriendlyOperationException(Resources.ErrorOperationTypeInfoArgument); } typeInfo = checkInfo; continue; } list.Add(element); } return(list.ToArray()); }
/// <summary> /// 戻り値をAppVarで取得する通信。 /// </summary> /// <param name="invoker">呼び出し元。</param> /// <param name="friendlyConnector">アプリケーションとの接続者。</param> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="varAddress">変数アドレス。</param> /// <param name="typeFullName">タイプフルネーム。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> /// <returns>変数。</returns> internal static AppVar SendAndVarReceive(object invoker, IFriendlyConnector friendlyConnector, ProtocolType protocolType, OperationTypeInfo operationTypeInfo, VarAddress varAddress, string typeFullName, string operation, object[] arguments) { object value = SendAndValueReceive(invoker, friendlyConnector, protocolType, operationTypeInfo, varAddress, typeFullName, operation, arguments); VarAddress retHandle = value as VarAddress; return((retHandle == null) ? (null) : (new AppVar(friendlyConnector, retHandle))); }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="varAddress">変数アドレス。</param> /// <param name="typeFullName">タイプフルネーム。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> public ProtocolInfo(ProtocolType protocolType, OperationTypeInfo operationTypeInfo, VarAddress varAddress, string typeFullName, string operation, object[] arguments) { _protocolType = protocolType; _operationTypeInfo = operationTypeInfo; _varAddress = varAddress; _typeFullName = typeFullName; _operation = operation; _arguments = arguments; }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="varAddress">変数アドレス。</param> /// <param name="typeFullName">タイプフルネーム。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> public ProtocolInfo(ProtocolType protocolType, OperationTypeInfo operationTypeInfo, VarAddress varAddress, string typeFullName, string operation, object[] arguments) { _protocolType = protocolType; _operationTypeInfo = operationTypeInfo; _varAddress = varAddress; _typeFullName = typeFullName; _operation = operation; _arguments = arguments; }
/// <summary> /// 操作取得。 /// </summary> /// <param name="operation">操作名称。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="async">非同期実行オブジェクト。</param> /// <returns>操作</returns> internal FriendlyOperation this[string operation, OperationTypeInfo operationTypeInfo, Async async] { get { if (async == null) { return new FriendlyOperationOwner(this, operationTypeInfo, operation).FriendlyOperation; } else { async.Initialize(this); return new AsyncFriendlyOperationOwner(async, operationTypeInfo, operation).FriendlyOperation; } } }
/// <summary> /// 操作取得。 /// </summary> /// <param name="operation">操作名称。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="async">非同期実行オブジェクト。</param> /// <returns>操作</returns> internal FriendlyOperation this[string operation, OperationTypeInfo operationTypeInfo, Async async] { get { if (async == null) { return(new FriendlyOperationOwner(this, operationTypeInfo, operation).FriendlyOperation); } else { async.Initialize(this); return(new AsyncFriendlyOperationOwner(async, operationTypeInfo, operation).FriendlyOperation); } } }
/// <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="invoker">呼び出し元。</param> /// <param name="friendlyConnector">アプリケーションとの接続者。</param> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="varAddress">変数アドレス。</param> /// <param name="typeFullName">タイプフルネーム。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> /// <returns>値。</returns> internal static object SendAndValueReceive(object invoker, IFriendlyConnector friendlyConnector, ProtocolType protocolType, OperationTypeInfo operationTypeInfo, VarAddress varAddress, string typeFullName, string operation, object[] arguments) { //配列の場合の調整 arguments = AdjustArrayArgs(arguments); ReturnInfo ret = friendlyConnector.SendAndReceive(new ProtocolInfo(protocolType, operationTypeInfo, varAddress, typeFullName, operation, ConvertAppVar(friendlyConnector, arguments))); GC.KeepAlive(invoker); GC.KeepAlive(friendlyConnector); for (int i = 0; i < arguments.Length; i++) { if (arguments[i] != null) { GC.KeepAlive(arguments[i]); } } if (ret.Exception != null) { throw new FriendlyOperationException(ret.Exception); } return ret.ReturnValue; }
/// <summary> /// 戻り値を値で取得する通信処理。 /// 通信基本形。 /// </summary> /// <param name="invoker">呼び出し元。</param> /// <param name="friendlyConnector">アプリケーションとの接続者。</param> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="varAddress">変数アドレス。</param> /// <param name="typeFullName">タイプフルネーム。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> /// <returns>値。</returns> internal static object SendAndValueReceive(object invoker, IFriendlyConnector friendlyConnector, ProtocolType protocolType, OperationTypeInfo operationTypeInfo, VarAddress varAddress, string typeFullName, string operation, object[] arguments) { //配列の場合の調整 arguments = AdjustArrayArgs(arguments); ReturnInfo ret = friendlyConnector.SendAndReceive(new ProtocolInfo(protocolType, operationTypeInfo, varAddress, typeFullName, operation, ConvertAppVar(friendlyConnector, arguments))); GC.KeepAlive(invoker); GC.KeepAlive(friendlyConnector); for (int i = 0; i < arguments.Length; i++) { if (arguments[i] != null) { GC.KeepAlive(arguments[i]); } } if (ret.Exception != null) { throw new FriendlyOperationException(ret.Exception); } return(ret.ReturnValue); }
/// <summary> /// 引数型情報取得。 /// </summary> /// <param name="typeFinder">タイプ検索。</param> /// <param name="operationTypeInfo">操作型情報。</param> /// <param name="argTypesOri">元引数。</param> /// <returns>型情報</returns> static Type[] GetArgTypes(TypeFinder typeFinder, OperationTypeInfo operationTypeInfo, Type[] argTypesOri) { List <Type> argTypes = new List <Type>(); if (operationTypeInfo == null) { argTypes.AddRange(argTypesOri); } else { for (int i = 0; i < operationTypeInfo.Arguments.Length; i++) { Type type = typeFinder.GetType(operationTypeInfo.Arguments[i]); if (type == null) { throw new InformationException(string.Format(CultureInfo.CurrentCulture, ResourcesLocal.Instance.UnknownTypeInfoFormat, operationTypeInfo.Arguments[i])); } argTypes.Add(type); } //object[]指定された場合の特殊処理 if (operationTypeInfo.Arguments.Length == 1 && operationTypeInfo.Arguments[0] == typeof(object[]).ToString() && argTypesOri.Length != 1) { throw new InformationException(string.Format(CultureInfo.CurrentCulture, ResourcesLocal.Instance.ErrorOperationTypeArgInfoForObjectArrayFormat, MakeErrorInvokeArgInfo(argTypes.ToArray()), MakeErrorInvokeArgInfo(argTypesOri))); } if (argTypesOri.Length != operationTypeInfo.Arguments.Length) { throw new InformationException(string.Format(CultureInfo.CurrentCulture, ResourcesLocal.Instance.ErrorOperationTypeArgInfoFormat, MakeErrorInvokeArgInfo(argTypes.ToArray()), MakeErrorInvokeArgInfo(argTypesOri))); } } return(argTypes.ToArray()); }
/// <summary> /// 戻り値を値で取得する通信処理。 /// </summary> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> /// <returns>値。</returns> internal override object SendAndValueReceive(ProtocolType protocolType, OperationTypeInfo operationTypeInfo, string operation, object[] arguments) { return FriendlyTalker.SendAndValueReceive(this, _friendlyConnector, protocolType, operationTypeInfo, null, _staticOperationTypeFullName, operation, arguments); }
/// <summary> /// 引数を解決する。 /// </summary> /// <param name="srcArgs">元引数。</param> /// <param name="async">非同期実行オブジェクト。</param> /// <param name="typeInfo">操作タイプ情報。</param> /// <returns>解決した後の引数。</returns> internal static object[] ResolveArguments(object[] srcArgs, out Async async, out OperationTypeInfo typeInfo) { return(ResolveAsyncAndTypeInfo(srcArgs, out async, out typeInfo)); }
/// <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]); }
public static OperationTypeInfo[] GetOperationTypeInfos() { OperationTypeInfo[] result = null; if (CacheUtil.TryGetValue<OperationTypeInfo[]>("OperationTypeInfos", out result)) return result; lock (s_GetOperationTypeInfoLocker) { if (CacheUtil.TryGetValue<OperationTypeInfo[]>("OperationTypeInfos", out result)) return result; List<OperationTypeInfo> infos = new List<OperationTypeInfo>(); Hashtable flags = new Hashtable(); Assembly currentAssembly = Assembly.GetExecutingAssembly(); Type typeOfOperation = typeof(Operation); Type typeOfOperationTypeAttribute = typeof(OperationTypeAttribute); foreach (Type type in currentAssembly.GetTypes()) { if (type.IsDefined(typeOfOperationTypeAttribute, true) && type.IsSubclassOf(typeOfOperation)) { OperationTypeAttribute info = (OperationTypeAttribute)OperationTypeAttribute.GetCustomAttribute(type, typeof(OperationTypeAttribute), true); OperationTypeInfo i = new OperationTypeInfo(type.FullName, info); if (flags.ContainsKey(info.DisplayName) == false) { infos.Add(i); flags.Add(info.DisplayName, true); } } } infos.Sort(); result = infos.ToArray(); CacheUtil.Set<OperationTypeInfo[]>("OperationTypeInfos", result); return result; } }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="async">非同期実行クラス。</param> /// <param name="operationTypeInfo">操作タイプ情報。(オーバーロードの解決等に使用します。)</param> /// <param name="operation">操作名称。</param> internal AsyncFriendlyOperationOwner(Async async, OperationTypeInfo operationTypeInfo, string operation) { _async = async; _operationTypeInfo = operationTypeInfo; _operation = operation; }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="talker">操作通信社</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="operation">操作名称。</param> internal FriendlyOperationOwner(OperationTalker talker, OperationTypeInfo operationTypeInfo, string operation) { _operationTalker = talker; _operationTypeInfo = operationTypeInfo; _operation = operation; }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="async">非同期実行クラス。</param> /// <param name="operationTypeInfo">操作タイプ情報。(オーバーロードの解決等に使用します。)</param> /// <param name="operation">操作名称。</param> internal AsyncFriendlyOperationOwner(Async async, OperationTypeInfo operationTypeInfo, string operation) { _async = async; _operationTypeInfo = operationTypeInfo; _operation = operation; }
/// <summary> /// 戻り値を値で取得する通信処理。 /// </summary> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> /// <returns>値。</returns> internal abstract object SendAndValueReceive(ProtocolType protocolType, OperationTypeInfo operationTypeInfo, string operation, object[] arguments);
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="talker">操作通信社</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="operation">操作名称。</param> internal FriendlyOperationOwner(OperationTalker talker, OperationTypeInfo operationTypeInfo, string operation) { _operationTalker = talker; _operationTypeInfo = operationTypeInfo; _operation = operation; }
/// <summary> /// 引数を解決する。 /// </summary> /// <param name="srcArgs">元引数。</param> /// <param name="async">非同期実行オブジェクト。</param> /// <param name="typeInfo">操作タイプ情報。</param> /// <returns>解決した後の引数。</returns> internal static object[] ResolveArguments(object[] srcArgs, out Async async, out OperationTypeInfo typeInfo) { return ResolveAsyncAndTypeInfo(srcArgs, out async, out typeInfo); }
/// <summary> /// 戻り値を値で取得する通信処理。 /// </summary> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> /// <returns>値。</returns> internal override object SendAndValueReceive(ProtocolType protocolType, OperationTypeInfo operationTypeInfo, string operation, object[] arguments) { return(FriendlyTalker.SendAndValueReceive(this, _friendlyConnector, protocolType, operationTypeInfo, null, _staticOperationTypeFullName, operation, arguments)); }
/// <summary> /// 非同期実行オブジェクトと操作タイプ情報に関して引数を解決する。 /// </summary> /// <param name="srcArgs">元引数。</param> /// <param name="async">非同期実行オブジェクト。</param> /// <param name="typeInfo">操作タイプ情報。</param> /// <returns>解決した後の引数。</returns> private static object[] ResolveAsyncAndTypeInfo(object[] srcArgs, out Async async, out OperationTypeInfo typeInfo) { List<object> list = new List<object>(); async = null; typeInfo = null; foreach(object element in srcArgs) { Async checkAsync = element as Async; if (checkAsync != null) { if (async != null) { throw new FriendlyOperationException(Resources.ErrorAsyncArgument); } async = checkAsync; continue; } OperationTypeInfo checkInfo = element as OperationTypeInfo; if (checkInfo != null) { if (typeInfo != null) { throw new FriendlyOperationException(Resources.ErrorOperationTypeInfoArgument); } typeInfo = checkInfo; continue; } list.Add(element); } return list.ToArray(); }
public void MethodOperationTypeInfo() { dynamic form = WindowControl.FromZTop(_app).AppVar.Dynamic(); OperationTypeInfo op = new OperationTypeInfo((string)form.GetType().FullName, typeof(Control).FullName); string type = _app.Type().TestTarget.MainForm.OverLoadMethodStatic(null, op); Assert.AreEqual(typeof(Control).FullName, type); }
public void MethodOperationTypeInfo2() { string text = string.Empty; try { dynamic form = WindowControl.FromZTop(_app).AppVar.Dynamic(); OperationTypeInfo op = new OperationTypeInfo((string)form.GetType().FullName, typeof(Control).FullName); string type = _app.Type().TestTarget.MainForm.OverLoadMethodStatic(null, op, op); } catch (FriendlyOperationException e) { text = e.Message; } Assert.AreEqual("引数に複数のOperationTypeInfoが見つかりました。" + Environment.NewLine + "OperationTypeInfoは一度の呼び出しで一つしか指定することができません。", text); }
public int InsertOrUpdateDepart(OperationTypeInfo oParam, bool isAdd) { string sql = ""; int _tmpInt = AppConst.IntNull; if (isAdd) { sql = @"INSERT INTO sys_OperationType ( TypeName, TypeDescription, Status ) VALUES ( @TypeName, @TypeDescription, @Status );set @SysNo = SCOPE_IDENTITY();"; } else { sql = @"UPDATE sys_OperationType SET TypeName=@TypeName,TypeDescription=@TypeDescription,Status=@Status WHERE SysNo=@SysNo"; } SqlCommand cmd = new SqlCommand(sql); SqlParameter paramSysNo = new SqlParameter("@SysNo", SqlDbType.Int, 4); SqlParameter paramTypeName = new SqlParameter("@TypeName", SqlDbType.VarChar, 50); SqlParameter paramTypeDescription = new SqlParameter("@TypeDescription", SqlDbType.VarChar, 500); SqlParameter paramStatus = new SqlParameter("@Status", SqlDbType.Int, 4); if (isAdd) { paramSysNo.Direction = ParameterDirection.Output; } else { if (oParam.SysNo != AppConst.IntNull) { paramSysNo.Value = oParam.SysNo; } else { paramSysNo.Value = System.DBNull.Value; } } if (oParam.TypeName != AppConst.StringNull) { paramTypeName.Value = oParam.TypeName; } else { paramTypeName.Value = System.DBNull.Value; } if (oParam.TypeDescription != AppConst.StringNull) { paramTypeDescription.Value = oParam.TypeDescription; } else { paramTypeDescription.Value = System.DBNull.Value; } if (oParam.Status != AppConst.IntNull) { paramStatus.Value = oParam.Status; } else { paramStatus.Value = System.DBNull.Value; } cmd.Parameters.Add(paramSysNo); cmd.Parameters.Add(paramTypeName); cmd.Parameters.Add(paramTypeDescription); cmd.Parameters.Add(paramStatus); if (isAdd) { SqlHelper.ExecuteNonQuery(cmd, out _tmpInt); oParam.SysNo = _tmpInt; return(1); } else { return(SqlHelper.ExecuteNonQuery(cmd)); } }
/// <summary> /// 戻り値を値で取得する通信処理。 /// </summary> /// <param name="protocolType">通信タイプ。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="operation">操作名称。</param> /// <param name="arguments">引数。</param> /// <returns>値。</returns> internal abstract object SendAndValueReceive(ProtocolType protocolType, OperationTypeInfo operationTypeInfo, string operation, object[] arguments);
public void MethodOperationTypeInfoAsync() { dynamic form = WindowControl.FromZTop(_app).AppVar.Dynamic(); OperationTypeInfo op = new OperationTypeInfo((string)form.GetType().FullName, typeof(Control).FullName); Async async = new Async(); dynamic type = _app.Type().TestTarget.MainForm.OverLoadMethodStatic(null, op, async); async.WaitForCompletion(); Assert.AreEqual(typeof(Control).FullName, (string)type); }
/// <summary> /// Returns a delegate to invoke static operations in the test application. /// </summary> /// <param name="operation">The operation name.</param> /// <param name="operationTypeInfo"> /// Operation type information. /// Used when there is more than one overload for the operation or you want to call an operation by the same name in a parent class. /// Often the operation can be resolved based on its parameters without specifying the operation type info. /// </param> /// <param name="async">Asynchronous execution.</param> /// <returns>Delegate to invoke static operations in the application.</returns> #else /// <summary> /// テスト対象アプリケーション内の変数の操作を呼び出すdelegateを取得します。 /// </summary> /// <param name="operation">操作。</param> /// <param name="operationTypeInfo">操作タイプ情報。</param> /// <param name="async">非同期実行オブジェクト。</param> /// <returns>操作実行delegate。</returns> #endif public FriendlyOperation this[string operation, OperationTypeInfo operationTypeInfo, Async async] { get { return(_appVar[operation, operationTypeInfo, async]); } }
public void MethodOperationTypeInfo() { OperationTypeInfo op = new OperationTypeInfo((string)_form.GetType().FullName, typeof(Control).FullName); string type = _form.OverLoadMethod(null, op); Assert.AreEqual(typeof(Control).FullName, type); }