Способ расширения и динамический объект
Я собираюсь обобщить свою проблему в следующем фрагменте кода.
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 ответа:
чтобы расширить ответ Стеци... методы расширения не поддерживаются динамической типизацией в виде методов расширения, т. е. вызываться, как если бы они были методами экземпляра. Однако, это будет работать:
dynamic dList = list; Console.WriteLine(Enumerable.First(dList));
конечно, это может быть или не быть полезным. Если бы вы могли дать больше информации о том, почему и как вы пытаетесь использовать динамический ввод, мы могли бы помочь больше.
чтобы расширить ответ Джона, причина, по которой это не работает, заключается в том, что в обычных, нединамических методах расширения кода работают, выполняя полный поиск всех классов, известных компилятору для статического класса, который имеет соответствующий метод расширения. Поиск идет в порядке, основанном на вложенности пространства имен и доступном
using
директивы в каждом пространстве имен.это означает, что для того, чтобы получить вызов метода динамического расширения правильно разрешен, каким-то образом DLR должен знай во время какие все пространства имен вложений и
using
директивы в исходном коде. У нас нет удобного механизма для кодирования всей этой информации в сайт вызова. Мы подумывали о том, чтобы изобрести такой механизм, но решили, что это слишком дорого и создает слишком большой риск графика, чтобы стоить того.