Метод расширения и динамический объект
Я собираюсь обобщить мою проблему в следующем фрагменте кода.
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<>