Quelques instructions supplémentaires pour exécuter avec le code des ciseaux. Supposons que vous ayez une classe similaire à
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Supposons qu'au moment de l'exécution vous ayez un FooContent
Si vous pouviez vous lier au moment de la compilation, vous voudriez
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
Cependant, vous ne pouvez pas le faire au moment de l'exécution. Pour ce faire au moment de l'exécution, procédez comme suit:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
Pour invoquer dynamiquement Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
Notez l'utilisation de dynamic
dans l'appel de méthode. Au moment de dynamicList
l' exécution le sera List<FooContent>
(en plus aussi IEnumerable<FooContent>
) puisque même l'utilisation de dynamic est toujours enracinée dans un langage fortement typé, le classeur d'exécution sélectionnera la Markdown
méthode appropriée . S'il n'y a pas de correspondance de type exact, il recherchera une méthode de paramètre d'objet et si aucune ne correspond, une exception de lieur d'exécution sera déclenchée pour avertir qu'aucune méthode ne correspond.
L'inconvénient évident de cette approche est une énorme perte de sécurité de type au moment de la compilation. Néanmoins, un code de ce type vous permettra d'opérer dans un sens très dynamique qui, au moment de l'exécution, est toujours entièrement tapé comme vous vous attendez à ce qu'il soit.