Pergunta

DataGridView, por exemplo, permite que você faça o seguinte:

DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];

mas para a vida de mim eu não posso encontrar a documentação sobre o operador de índice / de colchetes. O que eles chamam? Onde é implementado? ele pode jogar? Como posso fazer a mesma coisa em minhas próprias classes?

ETA: Obrigado por todas as respostas rápidas. Resumidamente: a documentação pertinente está sob a propriedade "Item"; o caminho para a sobrecarga é declarar uma propriedade como public object this[int x, int y]{ get{...}; set{...} }; o indexador para a DataGridView não joga, pelo menos de acordo com a documentação. Não menciona o que acontece se você fornecer coordenadas inválidos.

ETA Novamente: OK, apesar da documentação não faz nenhuma menção a ele (impertinente Microsoft!), Verifica-se que o indexador para o DataGridView irá de fato lançar uma ArgumentOutOfRangeException se você fornecê-lo com coordenadas inválidos. aviso justo.

Foi útil?

Solução

Você pode encontrar a forma de fazê-lo aqui . Em suma, é:

public object this[int i]
{
    get { return InnerList[i]; }
    set { InnerList[i] = value; }
}

Se você só precisa de um getter a sintaxe em abaixo pode ser usado como bem (a partir de C # 6).

Outras dicas

Essa seria a propriedade do item: http://msdn.microsoft.com /en-us/library/0ebtbkkc.aspx

Talvez algo como isso iria funcionar:

public T Item[int index, int y]
{ 
    //Then do whatever you need to return/set here.
    get; set; 
}
Operators                           Overloadability

+, -, *, /, %, &, |, <<, >>         All C# binary operators can be overloaded.

+, -, !,  ~, ++, --, true, false    All C# unary operators can be overloaded.

==, !=, <, >, <= , >=               All relational operators can be overloaded, 
                                    but only as pairs.

&&, ||                  They can't be overloaded

() (Conversion operator)        They can't be overloaded

+=, -=, *=, /=, %=                  These compound assignment operators can be 
                                    overloaded. But in C#, these operators are
                                    automatically overloaded when the respective
                                    binary operator is overloaded.

=, . , ?:, ->, new, is, as, sizeof  These operators can't be overloaded

    [ ]                             Can be overloaded but not always!

Fonte das informações

Para suporte:

public Object this[int index]
{

}

MAS

O operador matriz indexação não pode ser sobrecarregado ; no entanto, pode definir tipos indexadores, propriedades que levam um ou mais parâmetros. parâmetros de indexador estão entre colchetes, assim como índices de array, mas parâmetros de indexador pode ser declarada para ser de qualquer tipo (ao contrário de índices de matriz, que deve ser integral).

A partir MSDN

public class CustomCollection : List<Object>
{
    public Object this[int index]
    {
        // ...
    }
}

Para CLI C ++ (compilado com / clr) ver este link MSDN .

Em suma, uma propriedade pode ser dado o nome de "default":

ref class Class
{
 public:
  property System::String^ default[int i]
  {
    System::String^ get(int i) { return "hello world"; }
  }
};

Se você estiver usando C # 6 ou posterior, você pode usar sintaxe de expressão-bodied para get somente indexador:

public object this[int i] => this.InnerList[i];

Aqui está um exemplo de retornar um valor de um objeto lista interna. Deve dar-lhe a idéia.

  public object this[int index]
  {
     get { return ( List[index] ); }
     set { List[index] = value; }
  }

Se você quer dizer o indexador série ,, Você sobrecarga que apenas por escrever uma propriedade indexador .. E você pode sobrecarregar, (escrever como muitos como você deseja) propriedades de indexador, desde que cada um tem uma assinatura de parâmetro diferente

public class EmployeeCollection: List<Employee>
{
    public Employee this[int employeeId]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.EmployeeId == employeeId)
                    return emp;
            }

            return null;
        }
    }

    public Employee this[string employeeName]
    {   
        get 
        { 
            foreach(var emp in this)
            {
                if (emp.Name == employeeName)
                    return emp;
            }

            return null;
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top