Der Titel ist irgendwie dunkel. Ich möchte wissen, ob dies möglich ist:
string typeName = <read type name from somwhere>;
Type myType = Type.GetType(typeName);
MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>();
Offensichtlich wird MyGenericClass wie folgt beschrieben:
public class MyGenericClass<T>
Im Moment beschwert sich der Compiler, dass 'Der Typ oder Namespace' myType 'nicht gefunden werden konnte. "Es muss einen Weg geben, dies zu tun.
foo.Method((dynamic)myGenericClass)
für die Laufzeitmethodenbindung verwenden können, effektiv das Service Locator-Muster für die Methodenüberladungen eines Typs.public void Method<T>(T obj)
- ein Trick, den ich in den letzten 6 Jahren seit diesem Kommentar mehr als ein paar Mal angewendet habe; pAntworten:
Sie können dies nicht ohne Reflexion tun. Sie können dies jedoch mit Reflexion tun. Hier ist ein vollständiges Beispiel:
Hinweis: Wenn Ihre generische Klasse mehrere Typen akzeptiert, müssen Sie die Kommas einfügen, wenn Sie die Typnamen weglassen. Beispiel:
quelle
Leider nein gibt es nicht. Generische Argumente müssen zur Kompilierungszeit entweder als 1) gültiger Typ oder 2) als anderer generischer Parameter auflösbar sein. Es gibt keine Möglichkeit, generische Instanzen basierend auf Laufzeitwerten zu erstellen, ohne den großen Hammer der Verwendung von Reflektion.
quelle
Einige zusätzliche Anweisungen zum Ausführen mit Scherencode. Angenommen, Sie haben eine ähnliche Klasse wie
Angenommen, Sie haben zur Laufzeit einen FooContent
Wenn Sie zur Kompilierungszeit binden könnten, würden Sie wollen
Allerdings können Sie diese zur Laufzeit nicht. Um dies zur Laufzeit zu tun, würden Sie Folgendes tun:
Dynamisch aufrufen
Markdown(IEnumerable<FooContent> contents)
Beachten Sie die Verwendung von
dynamic
im Methodenaufruf. Zur LaufzeitdynamicList
wirdList<FooContent>
(zusätzlich auchIEnumerable<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.
quelle
Meine Anforderungen waren etwas anders, werden aber hoffentlich jemandem helfen. Ich musste den Typ aus einer Konfiguration lesen und den generischen Typ dynamisch instanziieren.
Zum Schluss nennen Sie es so. Definieren Sie den Typ mit einem Backtick .
quelle
Wenn Sie wissen, welche Typen übergeben werden, können Sie dies ohne Reflexion tun. Eine switch-Anweisung würde funktionieren. Natürlich würde dies nur in einer begrenzten Anzahl von Fällen funktionieren, aber es wird viel schneller sein als Reflexion.
quelle
In diesem Snippet möchte ich zeigen, wie eine dynamisch erstellte Liste erstellt und verwendet wird. Zum Beispiel füge ich hier der dynamischen Liste hinzu.
Ebenso können Sie jede andere Methode in der Liste aufrufen.
quelle