/// <summary>
        /// Records a value to the values array of this sample given the zero-based index of the value definition to be used.
        /// </summary>
        /// <remarks>The value must be defined as part of the event metric definition associated with this sample
        /// or an exception will be thrown.  The data type must also be compatible with the data type configured
        /// on the event metric definition or no data will be recorded.
        /// If called more than once for the same value, the prior value will be replaced.</remarks>
        /// <param name="valueIndex">The zero-based index within the value definition of the value to be recorded.</param>
        /// <param name="value">Optional.  The value to be recorded.</param>
        public void SetValue(int valueIndex, object value)
        {
            EventMetricValueDefinitionCollection valueDefinitions = Metric.Definition.ValueCollection;

            //we don't have to check that the value index isn't null, but it does have to be in range
            if ((valueIndex < 0) || (valueIndex >= valueDefinitions.Count))
            {
#if DEBUG
                //if we're compiled in debug mode, tell the user they blew it.
                throw new ArgumentOutOfRangeException(nameof(valueIndex), valueIndex.ToString(CultureInfo.CurrentCulture));
#else
                //trace log and return, nothing we can do.
                Log.Warning("Unable to add metric value because the value definition could not be found.",
                            "There is no value definition at index {1} for metric definition {0}",
                            Metric.Definition.Key, valueIndex);
                return;
#endif
            }

            //look up the value in the definition so we can process it
            EventMetricValueDefinition curValueDefinition = valueDefinitions[valueIndex];

            //and now we can use our one true method to add the value
            SetValue(curValueDefinition, value);
        }
        /// <summary>
        /// Records a value to the values array of this sample given its value definition.
        /// </summary>
        /// <remarks>The value must be defined as part of the event metric definition associated with this sample
        /// or an exception will be thrown.  The data type must also be compatible with the data type configured
        /// on the event metric definition or no data will be recorded.
        /// If called more than once for the same value, the prior value will be replaced.</remarks>
        /// <param name="valueDefinition">The metric value definition object of the value to be recorded.</param>
        /// <param name="value">Optional. The value to be recorded.</param>
        /// <exception cref="ArgumentNullException">Throw if the valueDefinition is null.</exception>
        public void SetValue(EventMetricValueDefinition valueDefinition, object value)
        {
            //make sure we got a value definition
            if (valueDefinition == null)
            {
                throw new ArgumentNullException(nameof(valueDefinition));
            }

            m_WrappedSample.SetValue(valueDefinition.WrappedValueDefinition, value);
        }