Friday, 1 May 2020

Debugging Angular using proxies to the real Backend API in Visual Studio Code

One of the problems of having separate Frontend and Backend is not being able to test against actual, real API on your Backend.

Sure you can fire up your Angular project using 'ng serve' and run against a bunch of mock data, but that is not testing your software.

What you actually want is to be able to debug the Frontend against your real Backend API as the Angular project would when its compiled into your Backend.


To be able to do this, you must write a proxy into your Angular project, to re-write HTTP requests using Angular HTTPInterceptor.

import { HttpInterceptor, HttpRequest } from '@angular/common/http/';
import { HttpHandler } from '@angular/common/http';

export class MyApiHttpInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler) {
        // Rewrite api calls to proxied Backend.
        req = req.clone({ url: `http://backendService.com:9000/${req.url}` });
        return next.handle(req)
    }
}


In your Angular app.module.ts, wire up the proxy through the providers.
providers: [
  { provide: HTTP_INTERCEPTORS, useClass: MyApiHttpInterceptor, multi: true },
]


Then to debug your project, you install VS Code extension Debugger for Chrome.
Configure your VS Code Debug Launcher settings (.vscode\launch.json) with the following options from default, but adjust the ports as you need.
Also take note that your workspace has to be correct to your Angular project root.
Also notice that we to disabled CORS and enabled Chrome Incognito Mode so that we are able to call to proxied Backend API.

{
 // Use IntelliSense to learn about possible attributes.
 // Hover to view descriptions of existing attributes.
 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
 "version": "0.2.0",
 "configurations": [
  {
   "type": "chrome",
   "runtimeArgs": ["--disable-web-security", "--incognito"],
   "request": "launch",
   "name": "Launch Chrome against localhost",
   // "url": "http://localhost:8080/",
   "url": "http://localhost:4200/",
   // "webRoot": "${workspaceFolder}",
   "webRoot": "${workspaceFolder}/AngularFolder"
  }
 ]
}

Friday, 28 February 2020

TypeScript and Observables

I have been wanting to grasp the idea of Observables and use them in my work.

Observables can be used to build a notification system, for example when something changes you can let others know.

After reading a few articles and not getting it, I got my hands dirty with code.
I only understand if I play with code.

I should not use code I do not understand.

In essence, an Observable is just a function that emits a value.

We store a set of subscribers on the Observable, and when it fires, all subscribers are notified via the Observable next function.

When we fire the Observable, it will look up all its subscribers and let them know via their Observer next functions.

In the example I played with, there are two classes.
Observable and Observer.

One instance of Observable is created.

Three instances of Observer are created. Apple, Orange, and Grape.
Observers are subscribed to the Observable.
Grape Observer is unsubscribed from the Observable.

Observable is fired to pass a message onto its Observer subscribers.


class Observable {
 observers: Array<Observer> = new Array();

 next(data: string) {
  if (this.observers.length > 0) {
   this.observers.forEach(observer => {
    observer.next(data);
   });
  }
 }

 subscribe(observer: Observer) {
  this.observers.push(observer);
 }

 unsubscribe(observer: Observer) {
  this.observers = this.observers.filter(filteredObserver => {
   return filteredObserver !== observer;
  });
 }
}

class Observer {
 name: string;

 constructor(name: string) {
  this.name = name;
 }

 next(data: string) {
  console.log(`${this.name} = ${data}`);
 }
}

let myObservable = new Observable();

let myObserver1 = new Observer('Observer Apple');
let myObserver2 = new Observer('Observer Orange');
let myObserver3 = new Observer('Observer Grape');

myObservable.subscribe(myObserver1);
myObservable.subscribe(myObserver2);
myObservable.subscribe(myObserver3);

myObservable.unsubscribe(myObserver3);

myObservable.next('Pass this message to the observer');


The output after firing the Observable.

Observer Apple = Pass this message to the observer 
Observer Orange = Pass this message to the observer


Friday, 8 February 2019

Powershell function return values


Recently came up against this problem in Powershell where the return value coming back from a function seemed strange. I spent some time debugging it and discovered that the results of commands are outputted from the function as well.

Take a look at the code below, notice that the match command results are returned as well. If we append Out-Null to one of them, it removes it from the return value.

function getCat {
  $result = "Meeow"
  
  "Cats Dogs Mice" -match "Mice"

  "Cats Dogs Mice" -match "C.ts?"

  return $result
}

PS /Users/kungfoowiz> $result = getCat
PS /Users/kungfoowiz> $result
True
True
Meeow

function getCat {
  $result = "Meeow"
  
  "Cats Dogs Mice" -match "Mice" | Out-Null

  "Cats Dogs Mice" -match "C.ts?"

  return $result
}

PS /Users/kungfoowiz> $result = getCat 
PS /Users/kungfoowiz> $result          
True                  
Meeow

The moral of the story, be careful of any commands that return a value:
chkdsk $drive

Instead assign them to a variable to prevent the return value being populated:
$result = chkdsk $drive

If you don't care about storing the value:
"Cats Dogs Mice" -match "Mice"

Just pipe the result to Out-Null:
"Cats Dogs Mice" -match "Mice" | Out-Null

Thursday, 27 September 2018

Last Day!


Ok, so I quit my job today. It took a bit longer to leave but yes this is my last day!

What did I learn?

Internalising Code
The quicker I can internalise and “know the code” then I can be highly effective developer. Spend more time reading to understand the code, as opposed to debugging through to understand.

Error Logs
Read the error logs carefully, both site logs, website logs, Elastic Search logs, any logs to give exact information of what’s wrong and what’s needed to be fixed. Seriously any time there is a problem, open those error logs.

Limits
Set limits on the work I commit to, note down exactly what I’m going to do on the ticket, eliminate any confusion, and then do the work. Use cases can be given to testers to establish what needs testing.

Testing
Balance creating good code and getting it quickly to testers. People just want stuff to work, they don’t care how it works. I have to be mindful of company rules on code quality but also deliver on time. It’s hard.

Stress
During stressful and pressured situations, ignore this pressure, just reliably reproduce the problem on my local. This will enable me to come up with the solution.

Understanding
Software is done when it’s done. Always deliver quality, and know that code. Even if I get fired, they can’t fire my understanding. I’ll take it and build something greater.

Friday, 14 July 2017

Interface Parameters in C#

So I started my new job and noticed in the code I am working on has great use of Interfaces. I became a bit confused about them being passed as method parameters:
public string GetCharacteristics(IApple Apple)
{
...
}

When an object instance is passed as an interface parameter instead of an object, it brings an important benefit of polymorphism. This looser temporal coupling between objects allows you to cleanly separate the class design from its implementation. You then simply pass in any object as an interface parameter to a method and all object parameters can be accessed using the same methods and properties. However, all object class definitions have to implement the expected interface.
public interface IApple
{
        string Type { get; set; }
        string Colour { get; set; }

        int Sweetness();

        bool IsEdible(); 
}

To me this seems like a form of generics, because I can potentially write the same code to handle a variety of object inputs of differing types.
public class Blender : IFruitOperations 
    {
        private int GetDrinkSweetness(IApple Apple)
        {
            return Apple.Sweetness(); 
        }

        public string GetCharacteristics(IApple Apple)
        {
            string Result = 
                $"Apple {Apple.Type} has " +
                $"{GetDrinkSweetness(Apple)} sweetness, ";

            if (Apple is GrannySmith)
                Result += $"and bitterness {(Apple as GrannySmith).Bitterness}. ";
            else if (Apple is PinkLady)
                Result += $"and tastiness {(Apple as PinkLady).Tastiness}. ";

            return Result; 
            
        }

    }


Some example code for future reference, I designed it in such a way that we have specific properties. They are accessed by casting the interface to the specific class type, for example GrannySmith (for Bitterness) or PinkLady (for Tastiness).

We also have decoupled implementations of the interface, as methods Sweetness and IsEdible, however because we are passing interfaces as parameters, we are able to access the unique implementations generically, via GetDrinkSweetness and GetCharacteristics methods.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceTest
{

    public interface IApple
    {
        string Type { get; set; }
        string Colour { get; set; }

        int Sweetness();

        bool IsEdible(); 
    }


    public interface IFruitOperations
    {
        string GetCharacteristics(IApple Apple); 
    }


    public class GrannySmith : IApple
    {
        public string Type { get; set; }
        public string Colour { get; set; }

        public int Bitterness { get; set; } 

        public int Sweetness()
        {
            return 1; 
        }

        public bool IsEdible()
        {
            return true; 
        }

        public GrannySmith()
        {
            Type = "Granny Smith";
            Colour = "Green";
            Bitterness = 5; 
        }
    }

    public class PinkLady: IApple
    {
        public string Type { get; set; } 
        public string Colour { get; set; } 

        public int Tastiness { get; set; } 

        public int Sweetness()
        {
            return -1; 
        }

        public bool IsEdible()
        {
            return false; 
        }

        public PinkLady()
        {
            Type = "Pink Lady";
            Colour = "Pink";
            Tastiness = -5; 
        }
    }


    public class Blender : IFruitOperations 
    {
        private int GetDrinkSweetness(IApple Apple)
        {
            return Apple.Sweetness(); 
        }

        public string GetCharacteristics(IApple Apple)
        {
            string Result = 
                $"Apple {Apple.Type} has " +
                $"{GetDrinkSweetness(Apple)} sweetness, ";

            if (Apple is GrannySmith)
                Result += $"and bitterness {(Apple as GrannySmith).Bitterness}. ";
            else if (Apple is PinkLady)
                Result += $"and tastiness {(Apple as PinkLady).Tastiness}. ";

            return Result;             
        }

    }


    class Program
    {
        static void Main(string[] args)
        {

            Blender MyBlender = new Blender(); 

            IApple Apple1 = new GrannySmith();
            Console.WriteLine(MyBlender.GetCharacteristics(Apple1));
            Console.WriteLine(
                "Edible? {0}",
                Apple1.IsEdible() ? "Yes" : "No");  


            IApple Apple2 = new PinkLady();
            Console.WriteLine(MyBlender.GetCharacteristics(Apple2));
            Console.WriteLine(
                "Edible? {0}",
                Apple2.IsEdible() ? "Yes" : "No"); 

            Console.ReadLine(); 

        }
    }


}

Tuesday, 13 June 2017

Web API REST Owin + Katana


A memo to myself about Web API REST code using Owin Katana packages.


Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



using Owin;
using Microsoft.Owin.Hosting;

using System.IO;

using System.Web.Http; 




namespace KatanaIntro
{


    // AppFunc alias. 
    using AppFunc = Func<IDictionary<string, object>, Task>; 


    class Program
    {
        static void Main(string[] args)
        {

            string Uri = "http://localhost:12345";

            using (WebApp.Start<Startup>(Uri))
            {
                Console.WriteLine("Web server started and listening ... ");
                Console.ReadKey();
                Console.WriteLine("Web server stopping ... "); 
            }


        }
    }





    public class Startup
    {


        public void Configuration(IAppBuilder App)
        {


            //// Return welcome page. 
            //App.UseWelcomePage();


            // Katana wrapper for OWIN. 
            //App.Run(
            //    // Use lambda to access the function. 
            //    ctx =>
            //    {
            //        // Access function data. 
            //        // Return a task. 
            //        // ctx.


            //        // Hello world. 
            //        return ctx.Response.WriteAsync("Hello world!");


            //    }
            //);




            // Test. 
            //App.Run(Context =>
            //{

            //    Context.Response.ContentType = "text/plain";
            //    return Context.Response.WriteAsync("Testing using content type ... ");

            //}
            //);



             


            // Dump environment. 
            //App.Use(async (ContextEnvironment, Next) =>
            //{

            //   foreach (var Item in ContextEnvironment.Environment)
            //       Console.WriteLine("{0}:{1}", Item.Key, Item.Value);

            //   await Next();


            //});



            // Dump request. 
            App.Use(async (ContextEnvironment, Next) =>
            {
                Console.WriteLine("Requesting: " + ContextEnvironment.Request.Path);
                await Next();

                //ContextEnvironment.Response.StatusCode = 404; 

                Console.WriteLine("Response: " + ContextEnvironment.Response.StatusCode); 
            });





            ConfigureWebApi(App); 



            // Use HelloWorldComponent. 
            App.Use<HelloWorldComponent>();

            // Syntactic sugar call. 
            //App.UseHelloWorld();




        }


        private void ConfigureWebApi(IAppBuilder App)
        {

            var Config = new HttpConfiguration();

            Config.Routes.MapHttpRoute(
                "DefaultApi",
                "api/{controller}/{id}",
                new { id = RouteParameter.Optional }
            );

            App.UseWebApi(Config); 

        }



    }




    // Syntactic sugar definition. 
    public static class AppBuilderExtensions
    {
        public static void UseHelloWorld(this IAppBuilder App)
        {
            App.Use<HelloWorldComponent>(); 
        }
    }




    public class HelloWorldComponent
    {

        AppFunc _NextComponent; 

        public HelloWorldComponent(AppFunc NextComponent)
        {
            _NextComponent = NextComponent;
        }


        //public Task Invoke(IDictionary<string, object> Environment)
        // public async Task Invoke(IDictionary<string, object> Environment)
        public Task Invoke(IDictionary<string, object> Environment)
        {
            //return null; 

            // await _NextComponent(Environment);  

            var Response = Environment["owin.ResponseBody"] as Stream;
            using (var Writer = new StreamWriter(Response))
                return Writer.WriteAsync("Hello using StreamWriter and owin.ResponseBody ... "); 

        }

    }



}



Models/Greeting.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace KatanaIntro
{
    public class Greeting
    {
        public string Text { get; set; }
    }

}



Controllers/GreetingController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Web.Http; 


namespace KatanaIntro
{
    public class GreetingController : ApiController
    {
        [AllowAnonymous] 
        [Route("api/Greeting")] 
        public Greeting Get()
        {
            return new Greeting { Text = "Hello world!" }; 
        }

    }

}



Notes to self:
1. Dlls not copied into bin folder (causes 404s).

2. App.config not copied into Web.config (causes http error 500).
Could not load file or assembly 'Microsoft.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)


Notes on executing: 

Check KatanaIntro properties, Output type = Class Library (dll for IIS Express) or Console App (standalone exe).

cd "C:\Users\DaviesE\Documents\MyWork\Visual Studio 2015\Projects\KatanaIntro\KatanaIntro"

IIS/Local/Debug
http://localhost:12345/api/Greeting

"c:\Program Files\IIS Express\iisexpress.exe" /path:"C:\Users\DaviesE\Documents\MyWork\Visual Studio 2015\Projects\KatanaIntro\KatanaIntro"

"c:\Program Files\IIS Express\iisexpress.exe" /path:"C:\Users\DaviesE\Documents\MyWork\Visual Studio 2015\Projects\KatanaIntro\KatanaIntro" /port:12345



References:


What are C# Generics?

So I don’t forget what C# Generics are, I created this memo + code (or memode).

Generics templatise your code maximising reuse, keeping it strongly typed and performant. Any type can be generic, but it is advised to use the new generic collection classes System.Collections.Generic inso System.Collections. You can use runtime reflection to get info about generic types.

Here is some code using generics on different types.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GenericsTest
{


    // Generic array definition. 
    public class MyGenericArray<X>
    {

        private X[] Array; 

        public MyGenericArray(int Size)
        {
            Array = new X[Size + 1];
        }

        public X GetItem(int Index)
        {
            return Array[Index];
        }

        public void SetItem(int Index, X Value)
        {
            Array[Index] = Value; 
        }

    }



    // Generic method definition. 
    public static class GenericMethod<T>
    {
        public static void Swap(ref T Left, ref T Right)
        {
            T Temp = Left;
            Left = Right;
            Right = Temp; 
        }
    }



    

    // Define test interface. 
    public interface ITest
    {
        int GetPropertyValue(); 
    } 

    // Inherit from ITest interface. 
    public class MyClassTest : ITest
    {

        private int MyProperty { get; set; }

        public MyClassTest(int InitialValue)
        {
            MyProperty = InitialValue;
        }


        // To prove our generic swap function works, 
        // we will nest a class within a class. 
        // The inner class has a method to get the property. 
        public int GetPropertyValue()
        {

            // Initialise. 
            Value MyValue = new Value(MyProperty);

            MyProperty = MyValue.GetPropertyValue();

            return MyProperty; 
            
        }


        // Finer precision of interface. 
        public interface IValue
        {
            int GetPropertyValue(); 
        }


        // Inherit from IValue interface.  
        public class Value : IValue
        {

            private int MyProperty { get; set; }

            public Value(int Value)
            {
                MyProperty = Value; 
            }

            public int GetPropertyValue()
            {
                return MyProperty; 
            }

        }

    }






    // Define test interface that contains another interface. 
    public interface ITestInterface : ITestAnotherInterface 
    {
        int MyProperty { get; set; } 
    }

    public interface ITestAnotherInterface
    {
        int MyPropertyAnother { get; set; }
    } 

    // Declare test class using multiple interfaces. 
    public class MultiInterface : ITestInterface
    {

        private int PropertyBase;
        private int PropertyAnother;

        public int MyProperty
        {
            get { return PropertyBase;  }
            set { PropertyBase = value;  }
        }

        public int MyPropertyAnother
        {
            get { return PropertyAnother;  }
            set { PropertyAnother = value;  }
        }


    } 



    // Define test interface. 
    public interface ITestOddEven {
        int GetValue(); 
    }

    // Declare test classes. 
    public class OddTest : ITestOddEven
    {
        private const int Even = 2;
        private const int Odd = 3;
        
        public int GetValue()
        {
            return Odd; 
        }

    } 

    public class EvenTest : ITestOddEven
    {
        private const int Even = 2;
        private const int Odd = 3;

        public int GetValue()
        {
            return Even;
        }
    }




    // Define test delegate. 
    public delegate int TestGetValue();





    class Program
    {



        static void Main(string[] args)
        {


            Random Generate = new Random();

            string Characters =
                "$%#@!*abcdefghijklmnopqrstuvwxyz" +
                "1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&";



            // Create generic int array. 
            MyGenericArray<int> IntArray = new MyGenericArray<int>(5);

            // Set values. 
            for (int Index = 0; Index < 5; Index++)
                IntArray.SetItem(Index, Generate.Next(1, 9999999));

            // Get values. 
            for (int Index = 0; Index < 5; Index++)
                Console.WriteLine(IntArray.GetItem(Index));





            // Create generic char array. 
            MyGenericArray<char> CharArray = new MyGenericArray<char>(5);

            // Set values. 
            for (int Index = 0; Index < 5; Index++)
                CharArray.SetItem(Index, Characters[Generate.Next(0, Characters.Length - 1)]);

            // Get values. 
            for (int Index = 0; Index < 5; Index++)
                Console.WriteLine(CharArray.GetItem(Index));





            // Create generic string array. 
            MyGenericArray<string> StringArray = new MyGenericArray<string>(5);

            // Set values. 
            for (int Index = 0; Index < 5; Index++)
            {

                string Value = "";

                for (int StringIndex = 0; StringIndex < 10; StringIndex++)
                    Value += Characters[Generate.Next(0, Characters.Length - 1)];

                StringArray.SetItem(Index, Value);

            }

            // Get values. 
            for (int Index = 0; Index < 5; Index++)
                Console.WriteLine(StringArray.GetItem(Index));





            // Create generic double array. 
            MyGenericArray<double> DoubleArray = new MyGenericArray<double>(5);

            // Set values. 
            for (int Index = 0; Index < 5; Index++)
                DoubleArray.SetItem(Index, Math.Round(Generate.NextDouble() *
                    Generate.Next(1, 1000), 2));

            // Get values. 
            for (int Index = 0; Index < 5; Index++)
                Console.WriteLine(DoubleArray.GetItem(Index));





            // Create generic byte array. 
            MyGenericArray<byte[]> ByteArray = new MyGenericArray<byte[]>(5);

            // Set values. 
            for (int Index = 0; Index < 5; Index++)
            {
                byte[] ByteBuffer = new byte[10];
                Generate.NextBytes(ByteBuffer);
                ByteArray.SetItem(Index, ByteBuffer);
            }

            // Get values. 
            Console.WriteLine("Getting byte array values:");
            for (int Index = 0; Index < 5; Index++)
            {
                Console.WriteLine(ByteArray.GetItem(Index).GetValue(0));
            }

            // Get values. 
            Console.WriteLine("Getting byte array values:");
            for (int Index = 0; Index < 5; Index++)
            {
                Console.WriteLine(ByteArray.GetItem(Index).GetValue(9));
            }





            // Byte test. 
            Byte Test = new Byte();
            Test = 0x99;
            Console.WriteLine("Byte test = {0}", Test.ToString());





            // Generic methods. 


            int A = 1, B = 2;
            // Before. 
            Console.WriteLine("Before");
            Console.WriteLine("A = {0}, B = {1}", A, B);
            // Swap. 
            GenericMethod<int>.Swap(ref A, ref B);
            // After. 
            Console.WriteLine("After");
            Console.WriteLine("A = {0}, B = {1}", A, B);


            char X = 'x', Y = 'y';
            // Before. 
            Console.WriteLine("Before");
            Console.WriteLine("X = {0}, Y = {1}", X, Y);

            GenericMethod<char>.Swap(ref X, ref Y);
            // After. 
            Console.WriteLine("After");
            Console.WriteLine("X = {0}, Y = {1}", X, Y);




            // Generate List string array. 
            List<string> MyStringList = new List<string>(4);
            // Populate. 
            for (int ItemIndex = 0; ItemIndex < 4; ItemIndex++)
            {
                var Value = "";

                for (int Index = 0; Index < 3; Index++)
                    Value += Characters[Generate.Next(0, Characters.Length - 1)];

                MyStringList.Add(Value);
            }
            // Before. 
            Console.WriteLine("Before");
            foreach (var ListItem in MyStringList.Cast<object>().Select((x, i) => new { Item = x, Index = i }))
                Console.WriteLine("Item[{0}] = {1}", ListItem.Index, ListItem.Item);

            // Swap all items. 
            //foreach (var ListItem in MyStringList.Cast<object>().Select((x, i) => new { Item = x, Index = i })) ; 
            for (int Index = 0; Index < 4; Index++)
            {

                // End reached, nothing to swap.    
                if (Index == MyStringList.Count() - 1)
                    continue;

                var Current = MyStringList[Index];
                var Next = MyStringList[Index + 1];

                GenericMethod<string>.Swap(ref Current, ref Next);

                MyStringList[Index] = Current;
                MyStringList[Index + 1] = Next;

            }

            // After. 
            Console.WriteLine("After");
            foreach (var ListItem in MyStringList.Cast<object>().Select((x, i) => new { Item = x, Index = i }))
                Console.WriteLine("Item[{0}] = {1}", ListItem.Index, ListItem.Item);




            // Create test class instances. 
            MyClassTest TestClass1 = new MyClassTest(5);
            MyClassTest TestClass2 = new MyClassTest(10);



            // MyClassTest[] TestClasses = new MyClassTest[2];  
            //{
            //    new MyClassTest(), 
            //    new MyClassTest()
            //};
            //TestClasses[0] = TestClass1;
            //TestClasses[1] = TestClass2;


            //Console.WriteLine(nameof(TestClass1));
            //Console.WriteLine(nameof(TestClass2));


            // Before. 
            Console.WriteLine("Before");
            Console.WriteLine(
                "TestClass1.GetPropertyValue() = {0}, TestClass2.GetPropertyValue() = {1} ",
                TestClass1.GetPropertyValue(), TestClass2.GetPropertyValue());

            // Swap. 
            GenericMethod<MyClassTest>.Swap(ref TestClass1, ref TestClass2);

            // After. 
            Console.WriteLine("After");
            Console.WriteLine(
                "TestClass1.GetPropertyValue() = {0}, TestClass2.GetPropertyValue() = {1} ",
                TestClass1.GetPropertyValue(), TestClass2.GetPropertyValue());





            // Create test classes with multiple interfaces. 
            MultiInterface MultiInterfaceTest1 = new MultiInterface();
            MultiInterfaceTest1.MyProperty = 1;
            MultiInterfaceTest1.MyPropertyAnother = 2;

            MultiInterface MultiInterfaceTest2 = new MultiInterface();
            MultiInterfaceTest2.MyProperty = 3;
            MultiInterfaceTest2.MyPropertyAnother = 4;

            // Before. 
            Console.WriteLine("Before");
            Console.WriteLine("MultiInterfaceTest1.MyProperty = {0}", MultiInterfaceTest1.MyProperty);
            Console.WriteLine("MultiInterfaceTest1.MyPropertyAnother = {0}", MultiInterfaceTest1.MyPropertyAnother);
            Console.WriteLine("MultiInterfaceTest2.MyProperty = {0}", MultiInterfaceTest2.MyProperty);
            Console.WriteLine("MultiInterfaceTest2.MyPropertyAnother = {0}", MultiInterfaceTest2.MyPropertyAnother);

            // Swap interfaces. 
            GenericMethod<MultiInterface>.Swap(ref MultiInterfaceTest1, ref MultiInterfaceTest2);

            // After. 
            Console.WriteLine("After");
            Console.WriteLine("MultiInterfaceTest1.MyProperty = {0}", MultiInterfaceTest1.MyProperty);
            Console.WriteLine("MultiInterfaceTest1.MyPropertyAnother = {0}", MultiInterfaceTest1.MyPropertyAnother);
            Console.WriteLine("MultiInterfaceTest2.MyProperty = {0}", MultiInterfaceTest2.MyProperty);
            Console.WriteLine("MultiInterfaceTest2.MyPropertyAnother = {0}", MultiInterfaceTest2.MyPropertyAnother);




            // Swap values in individual interfaces. 
            Console.WriteLine("Swapping values in individual interfaces ... ");
            int BaseValue = MultiInterfaceTest1.MyProperty;
            int AnotherValue = MultiInterfaceTest1.MyPropertyAnother;
            GenericMethod<int>.Swap(ref BaseValue, ref AnotherValue);
            MultiInterfaceTest1.MyProperty = BaseValue;
            MultiInterfaceTest1.MyPropertyAnother = AnotherValue;

            BaseValue = MultiInterfaceTest2.MyProperty;
            AnotherValue = MultiInterfaceTest2.MyPropertyAnother;
            GenericMethod<int>.Swap(ref BaseValue, ref AnotherValue);
            MultiInterfaceTest2.MyProperty = BaseValue;
            MultiInterfaceTest2.MyPropertyAnother = AnotherValue;

            // After. 
            Console.WriteLine("After");
            Console.WriteLine("MultiInterfaceTest1.MyProperty = {0}", MultiInterfaceTest1.MyProperty);
            Console.WriteLine("MultiInterfaceTest1.MyPropertyAnother = {0}", MultiInterfaceTest1.MyPropertyAnother);
            Console.WriteLine("MultiInterfaceTest2.MyProperty = {0}", MultiInterfaceTest2.MyProperty);
            Console.WriteLine("MultiInterfaceTest2.MyPropertyAnother = {0}", MultiInterfaceTest2.MyPropertyAnother);




            // Create interface variables. 
            ITestOddEven TestOddEven1 = new OddTest();
            ITestOddEven TestOddEven2 = new EvenTest();

            // Before. 
            Console.WriteLine("Before");
            Console.WriteLine("TestOddEven1.GetValue() = {0}", TestOddEven1.GetValue());
            Console.WriteLine("TestOddEven1.GetValue() = {0}", TestOddEven2.GetValue());

            // Swap out the GetValue methods by interface references. 
            GenericMethod<ITestOddEven>.Swap(ref TestOddEven1, ref TestOddEven2);

            // After. 
            Console.WriteLine("After");
            Console.WriteLine("TestOddEven1.GetValue() = {0}", TestOddEven1.GetValue());
            Console.WriteLine("TestOddEven1.GetValue() = {0}", TestOddEven2.GetValue());



            // Create delegates. 
            TestGetValue TestDelegateEven = TestOddEven1.GetValue;
            TestGetValue TestDelegateOdd = TestOddEven2.GetValue;

            // Before. 
            Console.WriteLine("Before");
            Console.WriteLine("TestDelegateEven = {0}", TestDelegateEven());
            Console.WriteLine("TestDelegateOdd = {0}", TestDelegateOdd());

            // Swap around method references using delegates. 
            GenericMethod<TestGetValue>.Swap(ref TestDelegateEven, ref TestDelegateOdd);

            // After. 
            Console.WriteLine("After");
            Console.WriteLine("TestDelegateEven = {0}", TestDelegateEven());
            Console.WriteLine("TestDelegateOdd = {0}", TestDelegateOdd());






            // Create delegates to test method parameters. 
            NumberFunction<int> FunctionTestAdd = new NumberFunction<int>(Add);
            NumberFunction<int> FunctionTestMultiply = new NumberFunction<int>(Multiply);

            // Before. 
            Console.WriteLine("Before");
            Console.WriteLine("FunctionTestAdd(2) = {0}", FunctionTestAdd(2));
            Console.WriteLine("FunctionTestMultiply(4) = {0}", FunctionTestMultiply(4));

            // Swap delegate references to methods. 
            GenericMethod<NumberFunction<int>>.Swap(ref FunctionTestAdd, ref FunctionTestMultiply);
            Console.WriteLine("Swapping delegate method references ...");
            Console.WriteLine("FunctionTestAdd(3) = {0}", FunctionTestAdd(3));
            Console.WriteLine("FunctionTestMultiply(1) = {0}", FunctionTestMultiply(1)); 







            Console.ReadLine();

        }


        // Define test generic delegate. 
        public delegate T NumberFunction<T>(T Value);

        // Define test methods for the delegate.  
        private static int Total = 0;

        public static int Add(int Number)
        {
            return Total += Number;
        }

        public static int Multiply(int Number)
        {
            return Total *= Number;
        }


    }

}