Myślę, że masz nieporozumienie co oznacza dynamic
. Zasadniczo, gdy powiesz kompilatorowi, że typ obiektu to dynamic
, "obiecujesz", że obiekt w czasie wykonywania będzie obsługiwał dowolne metody lub właściwości, które wywołasz, w zamian za kompilator nie narzekający na w czasie kompilacji. Obiecujesz także, że poniesiesz konsekwencje, jeśli złamiesz swoją obietnicę.
Kiedy mówimy, że obiekt jest dynamic
, kompilator nie może przyjąć założeń dotyczących typu, więc używa object
, wiedząc, że wszystko może być przechowywane jako object
. Wykonując IEnumerable<dynamic>
staje IEnumerable<object>
, z jedną istotną różnicą: można wywołać dowolną metodę na jej elementów, a kompilator nie powie słowa:
IEnumerable<SomeType> original = ...
foreach (dynamic x in original.AsDynamic()) { // Using your method
Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent!
}
Od original.AsDynamic()
daje sekwencję dynamic
obiektów kompilator nie narzeka na Twój telefon pod numer SomeUnsupportedMethod
.Jeśli ta metoda rzeczywiście nie jest obsługiwana w środowisku wykonawczym, program ulegnie awarii; jeśli metoda jest faktycznie obsługiwana przez elementy SomeType
, nie będzie awarii, a metoda zostanie wywołana.
Wszystko to zrobi dla ciebie dynamic
; statycznie, "element zastępczy" pozostanie object
, a typeof
powie Ci tyle. Ale dokładne możliwości obiektu (jego metody i właściwości) nie będą badane aż do czasu wykonania.
["W większości przypadków działa tak, jak ma obiekt typu."] (Http://msdn.microsoft.com/en-us/library/dd264736.aspx) –
Brak typu 'dynamic' w środowisku wykonawczym są one po prostu wpisywane jako obiekt, a informacje o powiązaniu metody są wyprowadzane w każdej witrynie wywołania z użyciem zmiennej dynamicznej. – Lee