C # расширить индексатор? - PullRequest
8 голосов
/ 02 сентября 2011

Можно ли использовать методы расширения для расширения индексатора? Я хочу иметь возможность получить значение ячейки из DataGridViewCell данного DataGridViewRow, используя текст заголовка, как это:


    object o = row["HeaderText"]; 

У меня есть этот код


    public static class Ext
    {
        public static object Cells(this DataGridViewRow r, string header)
        {
            foreach (DataGridViewCell c in r.Cells)
            {
                if (c.OwningColumn.HeaderText == header)
                {
                    return c.Value;
                }
            }
            return null;
        }
    }

и мне нужен аналогичный индексатор. Спасибо.

Ответы [ 6 ]

13 голосов
/ 02 сентября 2011

Индексаторы на самом деле являются свойствами, а свойства расширения не существуют в C #.Так что это не может быть сделано так, как вы хотите.

См. в этом сообщении в блоге для некоторой предыстории на эту тему и объяснения, почему эта функция была рассмотрена, но в конечном итоге исключена изC # 3.0.

5 голосов
/ 02 сентября 2011

Нет, это не так.Методы расширения являются просто синтаксическим сахаром для вызова статического метода, индексатор является свойством.

Выполнение

object o = new object();
o.ExtensionMethod();

эквивалентно

object o = new object();
Extensions.ExtensionMethod(o);

Методы расширения неизменить класс любым способом, они просто предоставляют вам более простой интерфейс для вызова статических методов.

2 голосов
/ 02 сентября 2011

К сожалению, нет.По сути, это будет «свойство расширения», которое не поддерживается.Вы должны использовать его как метод, как ваш текущий код.

Обратите внимание, что свойства расширения были запрошены при подключении несколько случаев , но никогда не включались вязык.

1 голос
/ 02 сентября 2011

Нет, это невозможно.Методы расширения ограничены только методами.Они не могут предоставить свойства, индексаторы или конструкторы

1 голос
/ 02 сентября 2011

Нет, вы не можете расширять операторы, такие как индексатор, методами расширения.

0 голосов
/ 14 ноября 2012

В качестве обходного пути для свойства расширения вы можете реализовать методы Getter и Setter Extension для объекта, используя основанный на отражении код индексатора объекта.

...