Пример #1
0
        private MethodBuilder GetBody(JoinGroup joinGroup)
        {
            Type returnType = joinGroup.JoinMethod.ReturnType;

            MethodBuilder result = target.DefineMethod(joinGroup.Name, MethodAttributes.Virtual | MethodAttributes.Public,
                                                       returnType, joinGroup.ParameterTypes );

            ILGenerator generator = result.GetILGenerator();

            for (int parameterIndex = 0; parameterIndex < joinGroup.Parameters.Length; parameterIndex++)
            {
                // Parameters are to be attributed and named nicely
                ParameterInfo parameter = joinGroup.Parameters[parameterIndex];
                result.DefineParameter(parameterIndex + 1, parameter.Attributes, parameter.Name);

             	generator.Emit(OpCodes.Ldarg_0);
                generator.Emit(OpCodes.Ldfld, channelImplementer
                               .GetJoinParameterChannelField(joinGroup.Name, parameterIndex,
                                                             parameter.ParameterType));

                generator.Emit(OpCodes.Ldarg, parameterIndex + 1);

                generator.EmitCall(OpCodes.Call, typeof(Channel<>)
                                   .MakeGenericType(new Type[] { parameter.ParameterType })
                                   .GetMethod("Send", new Type[] {parameter.ParameterType}), null);
            }

            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldfld, channelImplementer
                           .GetJoinChannelField(joinGroup.Name,
                                                returnType));

            generator.EmitCall(OpCodes.Call, typeof(Channel<>)
                               .MakeGenericType(new Type[] { returnType })
                               .GetMethod("Receive", new Type[] {}), null);

            generator.Emit(OpCodes.Ret);

            return result;
        }
Пример #2
0
 public void Implement(JoinGroup joinGroup)
 {
     target.DefineMethodOverride(GetBody(joinGroup), joinGroup.JoinMethod);
 }