static public void EmitAsDelegate(TypeEmitter declaringType, TypeReference delegateType, MethodReference targetMethod)
        {
            var definition = new FunctorMethodEmitter(declaringType, "AsDelegate", delegateType,
                                                      MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig);

            definition.EmitAsDelegate(delegateType, targetMethod);
        }
        static public void EmitConstructor(TypeEmitter declaringType, MethodReference targetMethod)
        {
            var definition = new FunctorMethodEmitter(declaringType, ".ctor", declaringType.Assembly.TypeSystem.Void,
                                                      MethodAttributes.Assembly | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName);

            definition.EmitConstructorBody(targetMethod);
        }
        static public void EmitInvoke(TypeEmitter declaringType, MethodReference targetMethod)
        {
            var definition = new FunctorMethodEmitter(declaringType, "Invoke", targetMethod.GetReturnType(),
                                                      MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig);

            definition.EmitInvokeBody(targetMethod);
        }