2009-05-28 6 views
1

Ich brauche den Typ Objekt für IProcessor über Reflexion zu erhalten und nach Dokumentation muss ich folgendes tun:Reflexion und Generic Art in null resultierende

Type.GetType("IProcessor`1[System.Int32]") 

jedoch, dass null zurückgibt. Ich habe dann versucht:

Type.GetType(typeof(IProcessor<int>).FullName) 

und immer noch eine Null.

Ich bin jedoch die Lage, mit der Art Argument bekommen:

Type.GetType(typeof(IProcessor<int>).AssemblyQualifiedName) 

Aber leider habe ich keine Version, Kultur oder publickey an der Aufrufstelle zur Verfügung. Irgendwelche Vorschläge, wie man das Artobjekt erhält?

EDIT: unten erwähnten Tippfehler korrigiert EDIT: mit dem Typeof-Operator im Code ist keine Option. Ich muss die Typobjektlaufzeit von einer Zeichenkette erhalten

+0

Können Sie einen Link auf die Dokumentation schreiben ? –

+0

Sie müssen den Code für den IP-Prozessor veröffentlichen, da ist etwas komisches an FullName, das ich nicht verstehe. Wenn es sich um eine Eigenschaft oder Methode handelt, wird es nicht kompiliert, und Sie können keine Schnittstellen verschachteln ... Stellen Sie im Grunde ein kurzes, aber vollständiges Programm zur Verfügung, das die von Ihnen beschriebenen Probleme kompiliert und aufzeigt. –

+0

Ich machte einen Tippfehler und kopierte es im Angriff. als (jetzt) ​​notiert unten sollte es typeof sagen (IP-Prozessor ) .FullName und typeof (IPProcessor ) .AssemblyQualifiedName und die String-Version vermisst eine Rückführung –

Antwort

5

verwenden Sie müssen ein bisschen vorsichtiger mit Ihrer Transkription des Codes sein, nach dem Sie fragen, da die Beispiele in Ihrer Frage Syntaxfehler enthalten; "FullName" und "AssemblyQualifiedName" müssen außerhalb der Klammer sein, nicht direkt auf dem Typ.

Als solches werde ich davon ausgehen, dass Sie gemeint:

Type.GetType("IProcessor`1[System.Int32]"); 

(beachten Sie die Graviszeichen zwischen IProcessor und 1, was sehr wichtig ist)

Zumindest für diese Syntax zu arbeiten, den vollständigen Namensraum enthalten müssen Sie, dass die Art in ist, also wenn IProcessor im Namensraum MyApp.Interfaces zum Beispiel ist, dann sollte der Code sein:

Type.GetType("MyApp.Interfaces.IProcessor`1[System.Int32]"); 

Beachten Sie jedoch, dass dies nur funktioniert, wenn sich der Typ, auf den Sie sich beziehen, in derselben Baugruppe befindet, von der aus Sie anrufen. Wenn dies nicht der Fall, dann zumindest sind Sie gehen zu müssen Montage Namen auf den Anruf an, als solche (vorausgesetzt, es in einer Baugruppe ist MyAssembly genannt):

Type.GetType("MyApp.Interfaces.IProcessor`1[System.Int32], MyAssembly"); 
+0

Ihr Recht über die Syntaxfehler, meine schlechte. Ich muss versuchen, den Assemblynamen anzugeben. Allerdings finde ich es seltsam, dass Sie den Namen der Assembly angeben müssen, wenn es sich um einen generischen Typ handelt. Der Code funktioniert gut für keine generischen Typen, die nur FullName verwenden –

+0

Beachten Sie, dass beim Testen in einer Anwendung die zweite Variante ohne den Assemblynamen einwandfrei funktionierte; Das lag nur daran, dass der Namespace und die Klasse in derselben Assembly auftraten, von der ich den GetType-Aufruf ausgeführt habe. Wenn der Typ, den Sie auflösen, nicht in der gleichen Assembly wie der GetType-Aufruf ist, dann benötigen Sie einen Assemblynamen, sonst werden Sie nicht – jerryjvl

+0

Was mich verwirrt ist der Unterschied zwischen Generika und Nicht-Generika, und es hat nicht in dem gleichen Namespace/Assembly zu sein, aber die Assembly Holding muss geladen werden, damit es funktioniert –

1

Der typeof-Operator erwartet einen Typnamen und gibt das Type-Objekt direkt zurück. Also, wenn Sie den Typ im Code verweisen können, um die Art zu erhalten Sie nur

typeof(IProcessor<int>) 

oder, für die offene generische Version Sie ein dann konstruieren einen geschlossenen Typ mit Reflexion

typeof(IProcessor<>) 
+0

Ich muss das Typ-Objekt aus einer Zeichenfolge zur Laufzeit abrufen.Der Typ von oben funktioniert gut, aber sie waren nur ein Mittel, um zu zeigen, dass ohne Schreibfehler im Namen habe ich immer noch einen Nullwert. Ich gebe zu, das ist nicht sehr klar in der Frage –