Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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}");
                }
            }
        }