Qualche ulteriore come eseguire con il codice delle forbici. Supponiamo di avere una classe simile a
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Supponiamo che in fase di esecuzione tu abbia un FooContent
Se fossi in grado di eseguire il binding in fase di compilazione, lo vorresti
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
Tuttavia non è possibile farlo in fase di esecuzione. Per fare questo in fase di esecuzione, si dovrebbe fare come segue:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
Invocare dinamicamente Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
Si noti l'uso di dynamic
nella chiamata del metodo. In fase di esecuzione dynamicList
sarà List<FooContent>
(inoltre anche IEnumerable<FooContent>
) dal momento che anche l'uso dinamico è ancora radicato in una lingua fortemente tipizzata, il raccoglitore runtime selezionerà il Markdown
metodo appropriato . Se non ci sono corrispondenze esatte di tipi, cercherà un metodo con parametri oggetto e se nessuna delle due corrisponderà a un'eccezione del raccoglitore di runtime verrà sollevata avvisando che nessun metodo corrisponde.
L'ovvio inconveniente di questo approccio è un'enorme perdita di sicurezza del tipo in fase di compilazione. Tuttavia, il codice lungo queste linee vi consentirà di operare in un senso molto dinamico che in fase di runtime è ancora completamente digitato come previsto.