Algumas dicas adicionais sobre como executar com o código de tesoura. Suponha que você tenha uma classe semelhante a
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Suponha que, em tempo de execução, você tenha um FooContent
Se você fosse capaz de ligar em tempo de compilação, desejaria
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
No entanto, você não pode fazer isso em tempo de execução. Para fazer isso em tempo de execução, faça o seguinte:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
Para chamar dinamicamente Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
Observe o uso de dynamic
na chamada de método. No tempo de execução, dynamicList
haverá List<FooContent>
(adicionalmente também sendo IEnumerable<FooContent>
), pois mesmo o uso de dinâmico ainda está enraizado em uma linguagem fortemente tipada, o fichário de tempo de execução selecionará o Markdown
método apropriado . Se não houver correspondências exatas de tipo, ele procurará um método de parâmetro de objeto e se nenhuma delas corresponder a uma exceção do fichário de tempo de execução será gerada, alertando que nenhum método corresponde.
A desvantagem óbvia dessa abordagem é uma enorme perda de segurança de tipo em tempo de compilação. No entanto, o código nesse sentido permitirá operar em um sentido muito dinâmico, que no tempo de execução ainda é totalmente digitado conforme o esperado.