Ich versuche ein paar mögliche Techniken zum Generieren eines dynamischen Proxy einer C# -Schnittstelle zur Laufzeit. Bisher habe ich festgestellt, dass Roslyn mich ohne allzu große Reibereien entschädigt hat, aber ich bin ein wenig im Umgang mit generischen Typen. Insbesondere erhalten Sie die zu analysierenden Typnamen.Verfahren zum Generieren von gültigen Typnamen mit generischen in Roslyn
Meine Basis-Workflow ist:
- Erstellen Sie das Gerüst für usings, einen Namespace und eine Klasse als
CompilationUnitSyntax
- die Schnittstelle Inspizieren
- auf der Schnittstelle Für jede Methode proxied bekommen, verwenden Sie die
MethodInfo
um eineMethodDeclarationSyntax
mitSyntaxFactory.MethodDeclaration
zu erstellen, mit dem Ziel, meine neue dynamische Klasse
Hier ist ein ex reichlich von dem Thema, das ich rätsel. An dieser Stelle scheint es, dass ich brauche eine Zeichenfolge zu analysieren, um ein TypeSyntax
zu erhalten (in diesem Fall für den Rückgabetyp), und der einzige Ort, wo ich es nehmen kann, ist von methodInfo.ReturnType.Name
:
var methodDecl = SyntaxFactory.MethodDeclaration(SyntaxFactory.ParseTypeName(methodInfo.ReturnType.Name), methodInfo.Name);
Das Problem ist, SyntaxFactory.ParseTypeName
ist ‚gültig‘ C# Syntax Typdeklarationen erwarten, zum Beispiel List<string>
, aber die Namen oder Fullnamen Zugriff auf Eigenschaften sind in der Form:
{Name = "List`1" FullName =
"System.Collections.Generic.List`1[[UnitTests.SamplePoco, UnitTests,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"} System.Type
{System.RuntimeType}
die offensichtlich nicht analysieren, mit den Backticks, Mangel an spitzen Klammern usw.
Gibt es eine bessere Brücke zwischen Reflection-Stilklassen (MethodInfo, Typen) und Roslyn-Syntaxeinheiten? Ich probiere auch eine reine Reflektionssender-Lösung aus, aber ich wollte sehen, ob ich ein Roslyn-basiertes hier bekommen könnte.
Sie können 'GetGenericTypeArguments()' rekursiv erweitern, anstatt die Zeichenfolge zu analysieren. – SLaks
Ich sehe nicht genau, wie dieser Ansatz diese Lücke überbrücken kann, vielleicht verpasse ich etwas. Dieser Pfad scheint nur Type-Objekte zurückgeben zu können, was ich bereits habe. Alle Überladungen der Roslyn-Funktion SyntaxFactory.MethodDeclaration() (was ich gerade anrufe) erwarten eine Instanz von TypeSyntax.Das scheint die grundlegende Hürde zu sein, die es zu überwinden gilt. –
Ja; Sie müssten immer noch Code schreiben, um ihn als C# -Stilnamen zu formatieren. – SLaks