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


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

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 86

3 ответа:

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

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

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

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

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

, потому что First() - Это не метод List. Он определяется в расширении Linq до IEnumerable<>