Метод расширения и динамический объект
Я собираюсь обобщить мою проблему на следующий фрагмент кода.
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
Над кодом работает нормально.
Теперь я попробовал следующее
dynamic dList = list;
Console.WriteLine(dList.First());
но я получаю RuntimeBinderException.Почему это так?
Ответы
Ответ 1
Чтобы расширить метод ответа Stecya..., методы расширения не поддерживаются динамической типизацией в форме методов расширения, т.е. называются так, как если бы они были методами экземпляра. Однако это будет работать:
dynamic dList = list;
Console.WriteLine(Enumerable.First(dList));
Конечно, это может быть или не быть полезным. Если вы могли бы дать больше информации о том, почему и как вы пытаетесь использовать динамическую типизацию, мы можем помочь больше.
Ответ 2
Чтобы развернуть ответ Джона, причина, по которой это не работает, заключается в том, что в обычных, нединамических методах расширения кода работает, выполняя полный поиск всех классов, известных компилятору для статического класса, который имеет метод расширения который соответствует. Поиск выполняется в порядке, основанном на вложенности пространств имен и доступных директивах using
в каждом пространстве имен.
Это означает, что для того, чтобы вызвать динамический вызов метода расширения, правильно разрешен, DLD должна знать во время выполнения, что все вложения имен и директивы using
были в вашем исходном коде. У нас нет механизма для кодирования всей этой информации на сайт вызова. Мы считали, что изобретаем такой механизм, но решили, что он слишком дорогостоящий и создает слишком большой риск для того, чтобы его стоило.
Ответ 3
Потому что First()
не метод List
. Он определен в Linq Extension для IEnumerable<>