Inheritance: ClickEvent
        public IEnumerable<IMetricsProvider> GetMetrics(int days)
        {
            Dictionary<int, ProviderMetrics> dictionary = new Dictionary<int,ProviderMetrics>();

            ///////////////////////////////////////////////////////////////////
            //
            // setup variables used throughout the routine
            //
            ///////////////////////////////////////////////////////////////////

            ET_Client client = CreateClient();

            string[] properties = new string[]
            {
                "EventDate",
                "SendID",
            };

            DateTime end = DateTime.Now;
            DateTime start = end - TimeSpan.FromDays(days);

            SimpleFilterPart filter = new SimpleFilterPart();
            filter.Property = "EventDate";
            filter.SimpleOperator = SimpleOperators.between;
            filter.DateValue = new DateTime[] { start, end };

            ///////////////////////////////////////////////////////////////////
            //
            // count bounces
            //
            ///////////////////////////////////////////////////////////////////

            ET_BounceEvent bounce = new ET_BounceEvent();
            bounce.GetSinceLastBatch = false;
            bounce.AuthStub = client;
            bounce.SearchFilter = filter;
            bounce.Props = properties;

            GetReturn results = bounce.Get();

            foreach (ET_BounceEvent item in results.Results)
            {
                if (!dictionary.ContainsKey(item.SendID))
                {
                    dictionary[item.SendID] = new ProviderMetrics();
                    dictionary[item.SendID].Name = GetEmailName(client, item.SendID);
                }

                dictionary[item.SendID].Bounces++;
            }

            ///////////////////////////////////////////////////////////////////
            //
            // count clicks
            //
            ///////////////////////////////////////////////////////////////////

            ET_ClickEvent click = new ET_ClickEvent();
            click.GetSinceLastBatch = false;
            click.AuthStub = client;
            click.SearchFilter = filter;
            click.Props = properties;

            results = click.Get();

            foreach (ET_ClickEvent item in results.Results)
            {
                if (!dictionary.ContainsKey(item.SendID))
                {
                    dictionary[item.SendID] = new ProviderMetrics();
                    dictionary[item.SendID].Name = GetEmailName(client, item.SendID);
                }

                dictionary[item.SendID].Clicks++;
            }

            ///////////////////////////////////////////////////////////////////
            //
            // count opens
            //
            ///////////////////////////////////////////////////////////////////

            ET_OpenEvent open = new ET_OpenEvent();
            open.GetSinceLastBatch = false;
            open.AuthStub = client;
            open.SearchFilter = filter;
            open.Props = properties;

            results = open.Get();

            foreach (ET_OpenEvent item in results.Results)
            {
                if (!dictionary.ContainsKey(item.SendID))
                {
                    dictionary[item.SendID] = new ProviderMetrics();
                    dictionary[item.SendID].Name = GetEmailName(client, item.SendID);
                }

                dictionary[item.SendID].Opens++;
            }

            ///////////////////////////////////////////////////////////////////
            //
            // count sends
            //
            ///////////////////////////////////////////////////////////////////

            ET_SentEvent send = new ET_SentEvent();
            send.GetSinceLastBatch = false;
            send.AuthStub = client;
            send.SearchFilter = filter;
            send.Props = properties;

            results = send.Get();

            foreach (ET_SentEvent item in results.Results)
            {
                if (!dictionary.ContainsKey(item.SendID))
                {
                    dictionary[item.SendID] = new ProviderMetrics();
                    dictionary[item.SendID].Name = GetEmailName(client, item.SendID);
                }

                dictionary[item.SendID].Sends++;
            }

            ///////////////////////////////////////////////////////////////////
            //
            // count unsubscribes
            //
            ///////////////////////////////////////////////////////////////////

            ET_UnsubEvent unsubscribe = new ET_UnsubEvent();
            unsubscribe.GetSinceLastBatch = false;
            unsubscribe.AuthStub = client;
            unsubscribe.SearchFilter = filter;
            unsubscribe.Props = properties;

            results = unsubscribe.Get();

            foreach (ET_UnsubEvent item in results.Results)
            {
                if (!dictionary.ContainsKey(item.SendID))
                {
                    dictionary[item.SendID] = new ProviderMetrics();
                    dictionary[item.SendID].Name = GetEmailName(client, item.SendID);
                }

                dictionary[item.SendID].Unsubscribes++;
            }

            return dictionary.Values;
        }
        static void TestET_ClickEvent()
        {

            DateTime filterDate = new DateTime(2013, 1, 15, 13, 0, 0);

            Console.WriteLine("--- Testing ClickEvent ---");
            ET_Client myclient = new ET_Client();

            Console.WriteLine("Retrieve Filtered ClickEvents with GetMoreResults");
            ET_ClickEvent oe = new ET_ClickEvent();
            oe.AuthStub = myclient;
            oe.SearchFilter = new SimpleFilterPart() { Property = "EventDate", SimpleOperator = SimpleOperators.greaterThan, DateValue = new DateTime[] { filterDate } };
            oe.Props = new string[] { "SendID", "SubscriberKey", "EventDate", "Client.ID", "EventType", "BatchID", "TriggeredSendDefinitionObjectID", "PartnerKey" };
            GetReturn oeGet = oe.Get();

            Console.WriteLine("Get Status: " + oeGet.Status.ToString());
            Console.WriteLine("Message: " + oeGet.Message.ToString());
            Console.WriteLine("Code: " + oeGet.Code.ToString());
            Console.WriteLine("Results Length: " + oeGet.Results.Length);
            Console.WriteLine("MoreResults: " + oeGet.MoreResults.ToString());
            // Since this could potentially return a large number of results, we do not want to print the results
            //foreach (ET_ClickEvent ClickEvent in oeGet.Results)
            //{
            //    Console.WriteLine("SubscriberKey: " + ClickEvent.SubscriberKey + ", EventDate: " + ClickEvent.EventDate.ToString());
            //}

            while (oeGet.MoreResults)
            {
                Console.WriteLine("Continue Retrieve Filtered ClickEvents with GetMoreResults");
                oeGet = oe.GetMoreResults();
                Console.WriteLine("Get Status: " + oeGet.Status.ToString());
                Console.WriteLine("Message: " + oeGet.Message.ToString());
                Console.WriteLine("Code: " + oeGet.Code.ToString());
                Console.WriteLine("Results Length: " + oeGet.Results.Length);
                Console.WriteLine("MoreResults: " + oeGet.MoreResults.ToString());
            }


            //The following request could potentially bring back large amounts of data if run against a production account	
            //Console.WriteLine("Retrieve All ClickEvents with GetMoreResults");
            //ET_ClickEvent oe = new ET_ClickEvent();
            //oe.authStub = myclient;
            //oe.props = new string[] { "SendID", "SubscriberKey", "EventDate", "Client.ID", "EventType", "BatchID", "TriggeredSendDefinitionObjectID", "PartnerKey" };
            //GetResponse oeGetAll = oe.Get();

            //Console.WriteLine("Get Status: " + oeGetAll.Status.ToString());
            //Console.WriteLine("Message: " + oeGetAll.Message.ToString());
            //Console.WriteLine("Code: " + oeGetAll.Code.ToString());
            //Console.WriteLine("Results Length: " + oeGetAll.Results.Length);
            //Console.WriteLine("MoreResults: " + oeGetAll.MoreResults.ToString());
            //// Since this could potentially return a large number of results, we do not want to print the results
            ////foreach (ET_ClickEvent ClickEvent in oeGet.Results)
            ////{
            ////    Console.WriteLine("SubscriberKey: " + ClickEvent.SubscriberKey + ", EventDate: " + ClickEvent.EventDate.ToString());
            ////}

            //while (oeGetAll.MoreResults)
            //{
            //    oeGetAll = oe.GetMoreResults();
            //    Console.WriteLine("Get Status: " + oeGetAll.Status.ToString());
            //    Console.WriteLine("Message: " + oeGetAll.Message.ToString());
            //    Console.WriteLine("Code: " + oeGetAll.Code.ToString());
            //    Console.WriteLine("Results Length: " + oeGetAll.Results.Length);
            //    Console.WriteLine("MoreResults: " + oeGetAll.MoreResults.ToString());
            //}
        }