Как использовать индексаторы с методами расширения, имеющими вызовы параметров и функций - PullRequest
5 голосов
/ 25 июня 2010

Можно ли использовать indexers с extension методами.

например. Рассмотрим это только в качестве примера.

    public static object SelectedValue(this DataGridView dgv, string ColumnName)
    {            
        return dgv.SelectedRows[0].Cells[ColumnName].Value;
    }

EDIT

  1. использование mygrid.SelectedValue("mycol")

  2. Как использовать его в качестве индексатора mygrid.SelectedValue["mycol"], а не над ним.

  3. Можно ли так же использовать его? mygrid.SelectedValue["mycol"](out somevalue);

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

Ответы [ 2 ]

4 голосов
/ 25 июня 2010

Ну, тут есть две проблемы:

  • C # не поддерживает (по большому счету) именованные индексаторы 1
  • C # не поддерживаетсвойства расширения, поэтому вы не можете сделать SelectedValue свойством, возвращающим что-то индексируемое, вместо этого

Так что нет, указанный вами синтаксис не будет работать.Вы могли бы заставить это работать:

mygrid.SelectedValue()["mycol"]

но это немного уродливо.Я бы придерживался формы метода на вашем месте.


1 C # 4 поддерживает вызов именованных индексаторов для COM-объектов.

0 голосов
/ 25 июня 2010

Позвольте мне попытаться уточнить использование и намерения Extension Method.

Рассмотрим Extension Method

public static bool IsNullOrEmpty(this string source)
{
    return source == null || source == string.Empty;
}

Теперь вы расширяете свой класс string с помощью этого Extension Method

var myString = "Hello World";
Assert.AreEqual(myString.IsNullOrEmpty(), false);

Вот что .NET делает при компиляции:

public static bool IsNullOrEmpty(string source)
{
    return source == null || source == string.Empty;
}

Использование нашей старой школы

var myString = "Hello World";
Assert.AreEqual(IsNullOrEmpty(myString), false);

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

Что ж, расширение индексаторов могло бы быть возможным, но Microsoft не думала об этом.

...