Algunas formas adicionales de ejecutar con código de tijera. Supongamos que tienes una clase similar a
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Supongamos que en tiempo de ejecución tienes un FooContent
Si pudieras enlazar en tiempo de compilación, querrías
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
Sin embargo, no puede hacer esto en tiempo de ejecución. Para hacer esto en tiempo de ejecución, haría lo siguiente:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
Invocar dinámicamente Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
Tenga en cuenta el uso de dynamic
en la llamada al método. En el tiempo de ejecución dynamicList
será List<FooContent>
(además de serlo IEnumerable<FooContent>
), ya que incluso el uso de la dinámica todavía está enraizado en un lenguaje fuertemente tipado, el enlazador de tiempo de ejecución seleccionará el Markdown
método apropiado . Si no hay coincidencias de tipo exactas, buscará un método de parámetro de objeto y si ninguna coincide, se generará una excepción de carpeta de tiempo de ejecución alertando que ningún método coincide.
El inconveniente obvio de este enfoque es una gran pérdida de seguridad de tipo en tiempo de compilación. Sin embargo, el código a lo largo de estas líneas le permitirá operar en un sentido muy dinámico que en tiempo de ejecución todavía está completamente escrito como espera que sea.