2012-07-27 5 views
6

bei der Lösung der FrageType.GetType(), HashSet <T> und Montage Qualifikation

Error Loading ASP.Net Profile

Ich kam über das Verhalten von Type.GetType (string Typname), die ich nicht verstehe.

Wenn immer den Typ eines List<int>, genügt es, die Art, wie

System.Collections.Generic.List`1 [[System.Int32]]

jedoch angeben, für HashSet<int>, muss ich einen voll qualifizierten Typnamen wie diese

System.Collections.Generic.HashSet`1 angeben [[System.Int32]], System.Core, Version = 4.0.0.0, Culture = neutr al, PublicKeyToken = b77a5c561934e089

Wenn ich auslassen jeden der Versammlung, Version, Kultur oder Public-Key-Token wird der Typ nicht gelöst.

-Code zu reproduzieren

// Returns expected type: 
Type tListWorks = 
    Type.GetType("System.Collections.Generic.List`1[[System.Int32]]"); 

// Returns null: 
Type tHashSetNull = 
    Type.GetType("System.Collections.Generic.HashSet`1[[System.Int32]]"); 

// Returns expected type: 
Type tHashSetWorks = 
    Type.GetType("System.Collections.Generic.HashSet`1[[System.Int32]], System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 

// Returns null (omitted Culture): 
Type tHashSetNoCultureFails = 
    Type.GetType("System.Collections.Generic.HashSet`1[[System.Int32]], System.Core, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089"); 

Fragen

  • Warum muss ich HashSet<T> voll qualifizieren, aber nicht List<T>?
  • Vorausgesetzt, dass die Version Qualifikation angegeben werden muss, was ist, wenn die .NET-Laufzeit 3.5 (erste, die HashSet<T> hatte) oder eine spätere wie .NET 4.5? Was, wenn die Laufzeit etwas ganz anderes ist als Silverlight oder Mono?
+0

Dies sollte auch arbeiten (obwohl ich nicht versucht haben): 'System.Collections.Generic.HashSet'1 [[System.Int32]], System.Core' –

+0

@Andrey: Das war auch meine Erwartung , aber das funktioniert nicht. –

+0

Dies könnte relevant sein: http://StackOverflow.com/A/2367674/39068 –

Antwort

5

List<T> ist defined in mscorelib, HashSet<T>is not.

Gemäß den documentation:

Wenn der Typ in dem aktuell ausgeführten Assembly oder in Mscorlib.dll ist, genügt es, den Typnamen von seinem Namespace qualifiziert zu liefern

Was Ihre zweite Frage lautetgibt null zurück, wenn Sie einer Assembly, die im aktuellen Framework/Profil nicht verfügbar ist, einen qualifizierten Typnamen angeben.

Der Grund erfordert die ganze Baugruppe Attribute in der Type.GetType Dokumentation angegeben wird (wie von Jason Malinowski in den Kommentaren darauf hingewiesen):

Wenn Typname den Namensraum enthält aber nicht den Namen der Assembly, diese Methode durchsucht nur die Assembly des aufrufenden Objekts und Mscorlib.dll in dieser Reihenfolge. Wenn typeName mit dem vollständigen oder vollständigen Assemblynamen vollständig qualifiziert ist, sucht diese Methode in der angegebenen Assembly.Wenn die Assembly einen starken Namen hat, ist ein vollständiger Assemblyname erforderlich.

+0

Ja, aber Qualifizierung ** nur mit der Montage ** funktioniert nicht. Ich muss mich mit dem Assembly, Version, Kultur und Public Key Token qualifizieren. –

+0

Der vollständige "Name" der Assembly enthält die Attribute "Version", "Culture" usw. –

+0

@Jason: Der Dokumentation folgend weiter: * Der für die Assemblierung qualifizierte Name eines Typs besteht aus dem Typnamen, einschließlich seines Namensraums, gefolgt von einem Komma, gefolgt vom Anzeigenamen der Baugruppe. * Keine Erwähnung, dass Kultur etc. ist benötigt http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx –