Метод расширения и динамический объект

Я собираюсь обобщить мою проблему в следующем фрагменте кода.

List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());

Выше код работает нормально.

Сейчас я попробовал следующее

dynamic dList = list;
 Console.WriteLine(dList.First());

но я получаю RuntimeBinderException. Почему это так?

3 ответа

Решение

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

dynamic dList = list;
Console.WriteLine(Enumerable.First(dList));

Конечно, это может или не может быть полезным. Если бы вы могли предоставить больше информации о том, почему и как вы пытаетесь использовать динамическую типизацию, мы могли бы помочь вам больше.

Чтобы расширить ответ Джона, причина, по которой это не работает, заключается в том, что в обычных, не динамических методах расширения кода работает полный поиск всех классов, известных компилятору, для статического класса, у которого есть соответствующий метод расширения. Поиск идет в порядке, основанном на вложенности пространства имен и доступных using директивы в каждом пространстве имен.

Это означает, что для правильного разрешения вызова метода динамического расширения DLR должен знать во время выполнения, что все вложения пространства имен и using директивы были в вашем исходном коде. У нас нет удобного механизма для кодирования всей этой информации в сайт вызова. Мы рассмотрели вопрос об изобретении такого механизма, но решили, что это слишком дорого и создали слишком большой риск для графика, чтобы стоить того.

Так как First() это не метод List, Это определено в Linq Extension to IEnumerable<>

Другие вопросы по тегам