Ich werde mein Problem im folgenden Code-Snippet zusammenfassen.
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
Der obige Code funktioniert einwandfrei.
Jetzt habe ich folgendes versucht
dynamic dList = list;
Console.WriteLine(dList.First());
aber ich bekomme RuntimeBinderException. Warum ist es so?
this
hier dynamisch ist, aber wenn Sie hier landen, sollten Sie sich wahrscheinlich auch diese FrageAntworten:
Um die Antwort von Stecya zu erweitern ... Erweiterungsmethoden werden durch dynamische Typisierung in Form von Erweiterungsmethoden nicht unterstützt , dh als Instanzmethoden bezeichnet. Dies wird jedoch funktionieren:
Das kann natürlich nützlich sein oder auch nicht. Wenn Sie weitere Informationen darüber geben könnten, warum und wie Sie versuchen, dynamisches Schreiben zu verwenden, können wir Ihnen möglicherweise weiterhelfen.
quelle
dynamic
wo Sie es wirklich brauchen ... Wenn Sie sonst mit Reflexion auf Mitglieder zugreifen würden, ist das ein großes Zeichen. Auf der anderen Seite bin ich ein eingefleischter statischer Typ - andere schlagen möglicherweise weniger pessimistische Richtlinien vor :)Um Jons Antwort zu erweitern, funktioniert dies nicht, weil bei regulären, nicht dynamischen Code-Erweiterungsmethoden alle dem Compiler bekannten Klassen nach einer statischen Klasse mit einer passenden Erweiterungsmethode durchsucht werden. Die Suche erfolgt in der Reihenfolge, in der die Verschachtelung des Namespaces und die verfügbaren
using
Anweisungen in jedem Namespace basieren .Das bedeutet , dass , um eine dynamische Erweiterung Methodenaufruf korrekt aufgelöst zu bekommen, irgendwie das DLR wissen , hat zur Laufzeit , was alle Namespace Verschachtelungen und
using
Richtlinien wurden im Quellcode . Wir haben keinen Mechanismus zum Codieren all dieser Informationen in die Anrufstelle. Wir haben überlegt, einen solchen Mechanismus zu erfinden, aber festgestellt, dass er zu teuer ist und zu viel Zeitplanrisiko birgt, um ihn wert zu sein.quelle
dynamic
Objekte gleich C # sind: EsDynamicObject
gibt also keine Möglichkeit, sie zu unterscheiden, und ist einer der Gründe, warum es nicht möglich ist, Erweiterungsmethoden hinzuzufügendynamic
, stimmt das?Weil
First()
ist keine Methode vonList
. Es ist in Linq Extension to definiertIEnumerable<>
quelle