Как вызвать метод расширения динамического типа? - PullRequest
24 голосов
/ 11 марта 2011

Я читаю книгу «C # in Depth, 2nd Edition» Джона Скита. Он сказал, что мы можем вызывать методы расширения с динамическими аргументами, используя два обходных пути, так же как

dynamic size = 5;
var numbers = Enumerable.Range(10, 10);
var error = numbers.Take(size);
var workaround1 = numbers.Take((int) size);
var workaround2 = Enumerable.Take(numbers, size);

Затем он сказал: «Оба подхода будут работать, если вы захотите вызвать метод расширения с динамическим значением в качестве неявного this значения». Я не знаю, как этого добиться.

Большое спасибо.

Ответы [ 2 ]

41 голосов
/ 11 марта 2011

Как это:

dynamic numbers = Enumerable.Range(10, 10);
var firstFive = Enumerable.Take(numbers, 5);

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

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

dynamic numbers = Enumerable.Range(10, 10);
var sequence = (IEnumerable<int>) numbers;
var firstFive = sequence.Take(5);

... но если вы имеете дело с динамическими типами, вы, возможно, не знаете тип элемента sequence, и в этом случае первая версия позволяет «компилятору времени выполнения» выяснить это, в основном.

3 голосов
/ 11 марта 2011

Метод расширения просто синтаксический сахар, он будет преобразован как обычный метод, вызываемый компилятором c #.Это преобразование зависит от текущего синтаксического контекста (какие пространства имен импортируются с помощью оператора).

Динамическая переменная обрабатывается во время выполнения.на этот раз CLR не может получить достаточно информации о синтаксисе контекста, чтобы решить, какой метод расширения используется.Так что это не работа.

...