Dodatkowe informacje na temat uruchamiania przy użyciu kodu nożyczek. Załóżmy, że masz klasę podobną do
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Załóżmy, że w czasie wykonywania masz FooContent
Gdybyś mógł powiązać w czasie kompilacji, chciałbyś
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
Jednak nie można tego zrobić w czasie wykonywania. Aby to zrobić w środowisku wykonawczym, wykonaj następujące czynności:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
Aby dynamicznie wywoływać Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
Zwróć uwagę na użycie dynamicw wywołaniu metody. W czasie wykonywania dynamicListbędzie List<FooContent>(dodatkowo również IEnumerable<FooContent>), ponieważ nawet użycie dynamiki jest nadal zakorzenione w silnie typowanym języku, spoiwo w czasie wykonywania wybierze odpowiednią Markdownmetodę. Jeśli nie ma dokładnych dopasowań typu, będzie szukał metody parametru obiektowego, a jeśli nie będzie pasował żaden wyjątek spoiwa środowiska wykonawczego, pojawi się ostrzeżenie, że żadna metoda nie pasuje.
Oczywistą wadą tego podejścia jest ogromna utrata bezpieczeństwa typu w czasie kompilacji. Niemniej jednak kod zgodny z tymi liniami pozwoli ci działać w bardzo dynamiczny sposób, że w środowisku wykonawczym jest nadal w pełni wpisany, tak jak się spodziewasz.