/// <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);
 }