private void AddUnaryMethod(TypeBuilder typeBuilder, RpcServiceDescription serviceDescription, RpcMethodDescription methodDescription) { var args = methodDescription.RpcMethod.GetParameters(); var methodBuilder = typeBuilder.DefineMethod( methodDescription.RpcMethodName, MethodAttributes.Public | MethodAttributes.Virtual, methodDescription.RpcMethod.ReturnType, (from arg in args select arg.ParameterType).ToArray() ); var il = methodBuilder.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldstr, serviceDescription.RpcServiceName); il.Emit(OpCodes.Ldstr, methodDescription.RpcMethodName); il.Emit(OpCodes.Ldarg_2); il.Emit( OpCodes.Call, _unaryMethodToCall.MakeGenericMethod(new [] { methodDescription.RpcMethod.GetParameters()[0].ParameterType, methodDescription.RpcMethod.ReturnType.GetGenericArguments()[0] }) ); il.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(methodBuilder, methodDescription.RpcMethod); }
private void AddMethods(TypeBuilder typeBuilder, Type serviceType) { var serviceDescription = new RpcServiceDescription(serviceType); foreach (var methodDescription in serviceDescription.RpcMethods) { switch (methodDescription.RpcMethodType) { case MethodType.Unary: this.AddUnaryMethod(typeBuilder, serviceDescription, methodDescription); break; case MethodType.ClientStreaming: this.AddClientStreamingMethod(typeBuilder, serviceDescription, methodDescription); break; default: throw new NotSupportedException($"Not support MethodType: {methodDescription.RpcMethodType}"); } } }