Могут ли методы расширения иметь общие параметры? - PullRequest
3 голосов
/ 25 января 2011

Может ли метод расширения иметь слово: List в качестве одного из параметров?

public static IEnumerable<XElement> GetSequenceDescendants(this IEnumerable<XElement> elements, params List<XName> names)
        {
            //do something
        }

Есть ли какие-либо ограничения на типы параметров, которые может иметь метод расширения?

Ответы [ 2 ]

7 голосов
/ 25 января 2011

Короткий ответ: метод расширения - это просто открытый статический метод, к которому можно обращаться, как к методу экземпляра первого параметра (благодаря ключевому слову this). Это означает, что вы можете использовать те же параметры, что и в любом статическом методе.

Но если вы хотите, чтобы параметры на самом деле были общими, вам нужно изменить свой метод на следующий:

public static IEnumerable<TElement> GetSequenceDescendants<TElement, TName>(this IEnumerable<TElement> elements, List<TName> names)
{
    //do something
}

Вы должны указать все общие аргументы в определении вашего метода.

Кроме того, вы не можете использовать ключевое слово params ни с чем, кроме массива, т. Е. С params TName[] все в порядке, но с params List<TName> нет.

0 голосов
/ 25 января 2011

Существуют ограничения на доступ к типу (например, когда компилятор может угадать универсальные типы по параметрам. У методов расширения есть одно ограничение меньше: вы можете "разыменовать" нулевые указатели (вы можете написать и метод расширения bool IsNullorEmpty(this string) используйте его для пустой строки.

Например: Linq полон хороших обобщенных методов расширения, и вы можете увидеть много замечательных примеров (с умным использованием обобщений) в этом вопросе:

Какие ваши любимые методы расширения для C #? (codeplex.com/extensionoverflow)

...