Zamierzam podsumować mój problem w następującym fragmencie kodu.
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
Powyższy kod działa poprawnie.
Teraz wypróbowałem następujące
dynamic dList = list;
Console.WriteLine(dList.First());
ale otrzymuję wyjątek RuntimeBinderException.Dlaczego tak jest?
this
tutaj jest dynamiczny, ale jeśli tu wylądujesz, prawdopodobnie powinieneś również spojrzeć na to pytanieOdpowiedzi:
Aby rozwinąć odpowiedź Stecyi ... metody rozszerzające nie są obsługiwane przez dynamiczne wpisywanie w postaci metod rozszerzających , tj. Wywoływane tak, jakby były metodami instancji. Jednak to zadziała:
Oczywiście może to być przydatne lub nie. Jeśli możesz podać więcej informacji o tym, dlaczego i jak próbujesz używać dynamicznego pisania, być może będziemy mogli bardziej pomóc.
źródło
dynamic
tam, gdzie naprawdę potrzebujesz ... w zasadzie, jeśli w innym przypadku miałbyś mieć dostęp do członków z refleksją, to duży znak. Z drugiej strony jestem zagorzałym statecznikiem - inni mogą sugerować mniej pesymistyczną politykę :)Aby rozwinąć odpowiedź Jona, powodem, dla którego to nie działa, jest to, że w zwykłych, niedynamicznych metodach rozszerzających kod działa, wykonując pełne wyszukiwanie wszystkich klas znanych kompilatorowi dla klasy statycznej, która ma pasującą metodę rozszerzającą. Wyszukiwanie przebiega w kolejności na podstawie zagnieżdżenia przestrzeni nazw i dostępnych
using
dyrektyw w każdej przestrzeni nazw.Oznacza to, że aby wywołanie metody rozszerzenia dynamicznego zostało poprawnie rozwiązane, DLR musi w jakiś sposób wiedzieć w czasie wykonywania, jakie zagnieżdżenia przestrzeni nazw i
using
dyrektywy znajdują się w kodzie źródłowym . Nie mamy przydatnego mechanizmu do kodowania wszystkich tych informacji w witrynie wywołania. Zastanawialiśmy się nad wynalezieniem takiego mechanizmu, ale zdecydowaliśmy, że jest to zbyt kosztowne i powoduje zbyt duże ryzyko związane z harmonogramem, aby było tego warte.źródło
dynamic
obiekty są równe C # :,DynamicObject
więc nie ma sposobu na ich rozróżnienie i jest to jeden z powodów, dla których nie jest możliwe dodanie metod rozszerzających dodynamic
, prawda?Ponieważ
First()
nie jest to metodaList
. Jest zdefiniowany w Linq Extension toIEnumerable<>
źródło