import sys
sys.path += ["TDOC.zip"]
import TDOC
TDOC.print_verse()
Где TDOC.zip (467 байт) содержит TDOC.py:
def print_verse(presents="""\
twelve drummers drumming,
eleven pipers piping,
ten lords a-leaping,
nine ladies dancing,
eigth maids a-milking,
seven swans a-swimming,
six geese a-laying,
five gold rings,
four calling birds,
three french hens,
two turtle doves, and
a partridge in a pear tree.""".split("\n")):
if presents:
print_verse(presents[1:])
number = presents[0].split(" ", 1)[0]
print("On the %s day of Christmas my true love gave to me %s" % (
dict(a="first", two="second", three="third", five="fifth").get(number, number+"th"),
" ".join(presents)))
Лучший способ явной привязки к определенному методу расширения - вызвать его с использованием синтаксиса общего метода. В вашем случае это можно сделать примерно так:
DumpList(Enumerable.Reverse(list));
Проблема с некоторыми другими подходами, упомянутыми здесь, в том, что они не всегда будут делать то, что вы хотите. Например, приведение списка так:
((IEnumerable)list).Reverse()
может закончиться вызовом совершенно другого метода в зависимости от импортированных вами пространств имен или от того, в каком типе определен вызывающий код.
Единственный способ быть на 100% уверенным в том, что вы привязка к определенному методу расширения заключается в использовании синтаксиса общего метода.
var list = new List<int>(new [] {1, 2, 3});
DumpList((list as IEnumerable<int>).Reverse());
ИЛИ
IEnumerable<int> list = new List<int>(new [] {1, 2, 3});
DumpList(list.Reverse());
Кажется, это работает
var stuff = new List<int>();
var list = Enumerable.Reverse(stuff);
Вам не нужно приводить параметр, чтобы выбрать правильный метод ... вам просто нужно уточнить метод.
List<int> list = new List<int>() {1, 2, 3};
DumpList(Enumerable.Reverse(list));
Если вы не возражаете против безобразия, и вы написали метод расширения, вы всегда можете вызвать:
MyExtensions.Reverse(list);
По сути, это просто статический метод. Я понял это вчера, когда ReSharper сошел с ума и решил переписать половину моих методов расширения как вызовы статического метода.
Что касается использования IEnumerable
IEnumerable<T>.Reverse<T>(list);
Но это дает мне ошибку компилятора, и ответ Джона верен для IEnumerable / List.