public void DefaultThrowsException()
        {
            try {
                DynamicProxyInvoker target = new DynamicProxyInvoker();
                IDemoService        proxy1 = DynamicProxy.CreateInstance <IDemoService>(target);
                proxy1.Foo(0, "");

                Assert.Fail("a NotImplementedException should have been thrown, but didnt!");
            }
            catch (NotImplementedException ex) {
                Assert.AreEqual("There is no Implementation for Method Foo(bar, suffix)", ex.Message);
            }
        }
        public void DynamicImplementationOfInterface()
        {
            DynamicProxyInvoker target = new DynamicProxyInvoker();

            target.DefineMethod("Foo",
                                (int bar, string suffix) => {
                return(bar.ToString() + " " + suffix);
            }
                                );

            IDemoService proxy1  = DynamicProxy.CreateInstance <IDemoService>(target);
            string       result1 = proxy1.Foo(123, "Hello");

            Assert.AreEqual("123 Hello", result1);
        }
        public void DefaultWithCustomFallback()
        {
            DynamicProxyInvoker target = new DynamicProxyInvoker();

            target.FallbackInvokeMethod = (method, args, names) => {
                Assert.AreEqual("Foo", method);
                Assert.AreEqual("booooo", args[1]);
                return("hihi");
            };

            IDemoService proxy1 = DynamicProxy.CreateInstance <IDemoService>(target);
            string       result = proxy1.Foo(0, "booooo");

            Assert.AreEqual("hihi", result);
        }
        public void DynamicSpecializationOfClass()
        {
            DynamicProxyInvoker target = new DynamicProxyInvoker();

            target.DefineMethod("GetMyName",
                                () => {
                return("Newton");
            }
                                );

            AnotherServiceToHijack proxy2 = DynamicProxy.CreateInstance <AnotherServiceToHijack>(target);
            string result2 = proxy2.GetMyName();

            Assert.AreEqual("Newton", result2);
        }