Как вызвать метод расширения динамического типа?

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

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". Я не знаю, как его достичь.

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

Ответ 1

Вот так:

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);

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

Ответ 2

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

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