/// <summary> /// 泛型方法调用 /// </summary> /// <param name="method">泛型方法信息</param> /// <param name="types">泛型参数类型集合</param> /// <param name="parameters">调用参数</param> /// <returns>返回值</returns> public static object InvokeGenericMethod(MethodInfo method, TmphRemoteType[] types, params object[] parameters) { if (method == null) TmphLog.Error.Throw(TmphLog.TmphExceptionType.Null); Debug.Assert(method != null, "method != null"); return method.MakeGenericMethod(types.getArray(value => value.Type)).Invoke(null, parameters); }
/// <summary> /// 泛型类型函数调用 /// </summary> /// <param name="remoteType">调用代理类型</param> /// <param name="methodName">调用函数名称</param> /// <param name="parameters">调用参数</param> /// <returns>函数返回值</returns> public static object InvokeGenericTypeMethod(TmphRemoteType remoteType, string methodName, params object[] parameters) { return GetGenericTypeMethod(remoteType, methodName).Invoke(null, parameters); }
/// <summary> /// 获取泛型类型函数信息 /// </summary> /// <param name="remoteType">调用代理类型</param> /// <param name="methodName">调用函数名称</param> /// <returns>泛型类型函数信息</returns> private static MethodInfo GetGenericTypeMethod(TmphRemoteType remoteType, string methodName) { var type = remoteType.Type; if (type.DeclaringType != null && (type.Name == GenericTypeServerName && type.DeclaringType.IsGenericType)) { var tcpCall = TmphTypeAttribute.GetAttribute<TmphTcpCall>(type, false, false); if (tcpCall != null && tcpCall.IsGenericTypeServerMethod) { tcpCall = TmphTypeAttribute.GetAttribute<TmphTcpCall>(type.DeclaringType, false, true); //cSharp.Default.IsInheritAttribute if (tcpCall != null && tcpCall.IsSetup) { TmphKeyValue<Type, TmphStateSearcher.TmphAscii<MethodInfo>> methods; var version = _genericTypeMethodVersion; if (!GenericTypeMethods.TryGetValue(type, out methods) || methods.Key != type) { TmphInterlocked.CompareSetSleep(ref _genericTypeMethodLock); try { if (version == _genericTypeMethodVersion || !GenericTypeMethods.TryGetValue(type, out methods)) { var methodInfos = type.GetMethods(BindingFlags.Static | BindingFlags.Public); methods = new TmphKeyValue<Type, TmphStateSearcher.TmphAscii<MethodInfo>>(type, new TmphStateSearcher.TmphAscii<MethodInfo>( methodInfos.getArray(value => value.Name), methodInfos)); GenericTypeMethods.Add(type, methods); ++_genericTypeMethodVersion; } } finally { _genericTypeMethodLock = 0; } } return methods.Value.Get(methodName); } } } TmphLog.Error.Throw(type.fullName() + " 不符合泛型类型服务器端调用"); return null; }
/// <summary> /// 泛型类型函数调用 /// </summary> /// <param name="remoteType">调用代理类型</param> /// <param name="methodName">调用函数名称</param> /// <param name="methodGenericTypes">方法泛型参数集合</param> /// <param name="parameters">调用参数</param> /// <returns>函数返回值</returns> public static object InvokeGenericTypeMethod(TmphRemoteType remoteType, string methodName, TmphRemoteType[] methodGenericTypes, params object[] parameters) { return GetGenericTypeMethod(remoteType, methodName) .MakeGenericMethod(methodGenericTypes.getArray(value => value.Type)) .Invoke(null, parameters); }