Indexed Properties in C#
This implementation allows for reusability of the indexer backing logic, as shown on MyClass two having two indexers using the same backing implementation. This pattern is much more reusable.

public abstract class PropertyIndexer&lt;TKey, TValue&gt;
{
    public abstract TValue this[TKey index] { get; set; }
}
public class MyClass
{
    private class StringDictionaryPropertyIndexer : PropertyIndexer&lt;string, string&gt;
    {
        private Dictionary&lt;string, string&gt; BackingCollection { get; set; }
        public StringDictionaryPropertyIndexer(Dictionary&lt;string, string&gt; backing)
        {
            this.BackingCollection = backing;
        }
        public override string this[string index]
        {
            get
            {
                string value;
                if (BackingCollection.TryGetValue(index, out value))
                    return value;
                return null;
            }
            set
            {
                BackingCollection[index] = value;
            }
        }
    }
    private Dictionary&lt;string, string&gt; data { get; set; }
    public PropertyIndexer&lt;string, string&gt; Data { get; private set; }
    private Dictionary&lt;string, string&gt; alternateData { get; set; }
    public PropertyIndexer&lt;string, string&gt; AlternateData { get; private set; }
    public MyClass()
    {
        data = new Dictionary&lt;string, string&gt;();
        Data = new StringDictionaryPropertyIndexer(data);
        alternateData = new Dictionary&lt;string, string&gt;();
        AlternateData = new StringDictionaryPropertyIndexer(alternateData);
    }
}