protected T GetServiceProperty <T>(Func <T> getCmd, T defaultValue
                                           , ActivityMessageTypes messageType = ActivityMessageTypes.Status
                                           , [System.Runtime.CompilerServices.CallerMemberName] string propName = "???")
        {
            T         retval = defaultValue;
            Exception xcp    = null;

            CheckDevice();

            try
            {
                retval = getCmd();
            }
            catch (Exception ex)
            {
                xcp = ex;
                string name = ex.GetType().Name;
            }

            if (xcp == null)
            {
                if (retval is ArrayList)
                {
                    LogActivityStart(messageType, "Get {0}: {1}", propName, retval);

                    StringBuilder sb   = new StringBuilder();
                    ArrayList     list = retval as ArrayList;

                    foreach (var item in list)
                    {
                        sb.Append((sb.Length > 0) ? ", " : "");
                        sb.Append(item.ToString());
                    }

                    LogActivityEnd(messageType, sb.ToString());
                }
                else if (retval is TrackingRates)
                {
                    LogActivityStart(ActivityMessageTypes.Parameters, "Get {0}:", propName);
                    StringBuilder sb = new StringBuilder();

                    TrackingRates rates = retval as TrackingRates;

                    if (rates == null)
                    {
                        sb.Append(" Did not return expected ITrackingRates collection!");
                    }
                    else if (rates.Count == 0)
                    {
                        sb.Append("Received invalid Tracking Rates collection.");
                    }
                    else
                    {
                        for (int i = 1; i <= rates.Count; ++i)
                        {
                            if (sb.Length > 0)
                            {
                                sb.Append(", ");
                            }

                            sb.Append(rates[i].ToString());
                        }
                    }

                    LogActivityEnd(ActivityMessageTypes.Parameters, sb.ToString());
                }
                else
                {
                    LogActivityLine(messageType, "Get {0}: {1}", propName, retval);
                }
            }
            else
            {
                LogActivityLine(messageType, "Get {0} Exception: {1}", propName, xcp.Message);
            }

            Exceptions.SetException(propName, xcp);

            return(retval);
        }