Eai filhotes, tudo bem? 

Hoje vou mostrar como se cria indexadores! Não sabe o que é um Indexador? Um indexador basicamente deixa sua classe com um comportamento semelhante ao de um array, deixa eu dar um exemplo:

Você consegue acessar um item de um array/collection apenas passando o ID/KEY:

 meuArray[1] = "teste"; 

O Indexador deixa nossa classe com esse comportamento.  Então vamos ao que interessa!!

Para criar o indexador numa classe basta você criar a seguinte propriedade:

  public TIPO this[int index]
    { ... 

Aonde o TIPO é o tipo do objeto/retorno, e o parâmetro pode ser qualquer tipo (Int, String, …) e ate mais de um (para matrizes ou etc…) , no nosso caso usaremos um inteiro para pegar o índice.

Criei duas classes para dar um exemplo:

/// 
/// Propriedades Genéricas
/// 
public class GenericProperty
{
    public enum DbType
    {
        Varchar,
        Int,
        Bit
    }
	public GenericProperty()
	{
	}

    public string Name { get; set; }

    public DbType Type { get; set; }

    //Faço um Override no ToString para poder mostrar o Nome do campo e o tipo na hora de invocar o ToString.
    public override string ToString()
    {
        return Name + " [" + Type + "]";
    }  
}

/// 
/// Classe com todas as propriedades genericas
/// 
public class PropertyControl
{
    // Coleção com as propriedades genericas
    private Collection<GenericProperty> colProp;

    //Nosso INDEXER do tipo GenericProperty
    public GenericProperty this[int index]
    {
        get { return colProp[index]; }

        set { colProp[index] = value; }
    }

    //Método que adiciona o item à coleção
    public void AddItem(GenericProperty newProp)
    {
        colProp.Add(newProp);
    }

    // Meu construtor tbm instancia a collection
    public PropertyControl()
    {
        colProp = new Collection<GenericProperty>();
    }
}
 

E pronto… como podemos ver abaixo, usamos nossa classe como uma array:

	
	//Instanciamos nossa Classe
        var ObjTeste = new PropertyControl();
	
	// Adiciona os itens 
	// Usando as chaves "{" na hora de criar um novo objeto, eu posso setar as propriedades do mesmo, sem precisar de um construtor
        ObjTeste.AddItem(new GenericProperty { Name = "Nome", Type = GenericProperty.DbType.Varchar });

        ObjTeste.AddItem(new GenericProperty { Name = "Idade", Type = GenericProperty.DbType.Int });

	// Alterando o valor pelo index, como se fosse uma collection normal
        ObjTeste[0].Name = "Endereco";        

        // Jogo no label o valor do nosso objeto, que vai ser "Idade [Int]"
        labelTeste.Text = ObjTeste[1].ToString();

Muito legal… Usando os indexadores nós temos a mesma comodidade de uma collection/array e também evitamos expor nossa collection, além de poder criar métodos de conversões no GET / SET do Indexador. E claro os Indexadores podem ser sobrecarregados.

Bom, espero que tenha ficado claro. Um bom dia para você e ate mais.

E para finalizar: pretendo estar mais presente no blog a partir de agora!

Fonte: http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx