Einige zusätzliche Anweisungen zum Ausführen mit Scherencode. Angenommen, Sie haben eine ähnliche Klasse wie
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Angenommen, Sie haben zur Laufzeit einen FooContent
Wenn Sie zur Kompilierungszeit binden könnten, würden Sie wollen
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
Allerdings können Sie diese zur Laufzeit nicht. Um dies zur Laufzeit zu tun, würden Sie Folgendes tun:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
Dynamisch aufrufen Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
Beachten Sie die Verwendung von dynamic
im Methodenaufruf. Zur Laufzeit dynamicList
wird List<FooContent>
(zusätzlich auch IEnumerable<FooContent>
) sein, da selbst die Verwendung von Dynamic noch in einer stark typisierten Sprache verwurzelt ist, wählt der Laufzeitbinder die entsprechende ausMarkdown
Methode aus. Wenn keine genauen Typübereinstimmungen vorhanden sind, wird nach einer Objektparameter-Methode gesucht. Wenn keine übereinstimmen, wird eine Laufzeitbinder-Ausnahme ausgelöst, die darauf hinweist, dass keine Methode übereinstimmt.
Der offensichtliche Nachteil dieses Ansatzes ist ein enormer Verlust an Typensicherheit beim Kompilieren. Mit Code in dieser Richtung können Sie jedoch in einem sehr dynamischen Sinne arbeiten, der zur Laufzeit immer noch vollständig so eingegeben wird, wie Sie es erwarten.