File: System\Diagnostics\Eventing\TraceLogging\EventPayload.cs
Project: ndp\clr\src\bcl\mscorlib.csproj (mscorlib)
using System.Collections.Generic;
using System.Collections;
 
#if !ES_BUILD_AGAINST_DOTNET_V35
using Contract = System.Diagnostics.Contracts.Contract;
#else
using Contract = Microsoft.Diagnostics.Contracts.Internal.Contract;
#endif
 
#if ES_BUILD_STANDALONE
namespace Microsoft.Diagnostics.Tracing
#else
namespace System.Diagnostics.Tracing
#endif
{
    /// <summary>
    /// EventPayload class holds the list of parameters and their corresponding values for user defined types passed to 
    /// EventSource APIs.
    /// Preserving the order of the elements as they were found inside user defined types is the most important characteristic of this class.
    /// </summary>
    internal class EventPayload : IDictionary<string, object>
    {
        internal EventPayload(List<string> payloadNames, List<object> payloadValues) 
        {
            Contract.Assert(payloadNames.Count == payloadValues.Count);
 
            m_names = payloadNames;
            m_values = payloadValues;
        }
 
        public ICollection<string> Keys { get { return m_names; } }
        public ICollection<object> Values { get { return m_values; } }
 
        public object this[string key]
        {
            get
            {
                if (key == null)
                    throw new System.ArgumentNullException("key");
 
                int position = 0;
                foreach(var name in m_names)
                { 
                    if (name == key)
                    {
                        return m_values[position];
                    }
                    position++;
                }
 
                throw new System.Collections.Generic.KeyNotFoundException();
            }
            set
            {
                throw new System.NotSupportedException();
            }
        }
 
        public void Add(string key, object value)
        {
            throw new System.NotSupportedException();
        }
 
        public void Add(KeyValuePair<string, object> payloadEntry)
        {
            throw new System.NotSupportedException();
        }
 
        public void Clear()
        {
            throw new System.NotSupportedException();
        }
 
        public bool Contains(KeyValuePair<string, object> entry)
        {
            return ContainsKey(entry.Key);
        }
 
        public bool ContainsKey(string key)
        {
            if (key == null)
                throw new System.ArgumentNullException("key");
 
            foreach (var item in m_names)
            {
                if (item == key)
                    return true;
            }
            return false;
        }
 
        public int Count { get { return m_names.Count; } }
 
        public bool IsReadOnly { get { return true; } }
 
        public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
        {
            for (int i = 0; i < Keys.Count; i++) 
            { 
                yield return new KeyValuePair<string, object>(this.m_names[i], this.m_values[i]); 
            } 
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            var instance = this as IEnumerable<KeyValuePair<string, object>>;
            return instance.GetEnumerator();
        }
 
        public void CopyTo(KeyValuePair<string, object>[] payloadEntries, int count)
        {
            throw new System.NotSupportedException();
        }
       
        public bool Remove(string key)
        {
            throw new System.NotSupportedException();
        }
 
        public bool Remove(KeyValuePair<string, object> entry)
        {
            throw new System.NotSupportedException();
        }
       
        public bool TryGetValue(string key, out object value)
        {
            if (key == null)
                throw new System.ArgumentNullException("key");
 
            int position = 0;
            foreach (var name in m_names)
            {
                if (name == key)
                {
                    value =  m_values[position];
                    return true;
                }
                position++;
            }
 
            value = default(object);
            return false;
        }
 
        #region private
        private List<string> m_names;
        private List<object> m_values;
        #endregion
    }
}