2012-07-27 9 views
6

Al resolver la cuestiónType.GetType(), HashSet <T> y la Asamblea Calificación

Error Loading ASP.Net Profile

me encontré con el comportamiento de Type.GetType (cadena typeName) que no entiendo.

Al conseguir el tipo de un List<int>, es suficiente para especificar el tipo que

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

Sin embargo, para HashSet<int>, debo especificar un nombre de tipo completo como éste

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

Si dejo a cabo cualquier de la asamblea, la versión, la cultura, o símbolo de clave pública, no se resuelve el tipo.

Código para reproducir

// 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"); 

Preguntas

  • ¿Por qué debo calificar totalmente HashSet<T> pero no List<T>?
  • Dado que se debe especificar la calificación de Versión, ¿qué pasa si el .NET Runtime es 3.5 (el primero que tenía HashSet<T>) o uno posterior como .NET 4.5? ¿Qué pasa si el tiempo de ejecución es algo completamente diferente a Silverlight o Mono?
+0

Esto también debería funcionar (aunque no lo he probado): 'System.Collections.Generic.HashSet'1 [[System.Int32]], System.Core' –

+0

@Andrey: Esa era mi expectativa demasiado , Pero eso no funciona. –

+0

esto podría ser relevante: http://stackoverflow.com/a/2367674/39068 –

Respuesta

5

List<T> es defined en mscorelib, HashSet<T>is not.

Según el documentation:

Si el tipo es en el montaje se está ejecutando actualmente o en Mscorlib.dll, es suficiente para abastecer el nombre del tipo calificado por su espacio de nombres

cuanto a su segunda pregunta, si proporciona un nombre de tipo calificado para un ensamblaje que no está disponible en el marco/perfil actual, GetType devolverá nulo.

La razón de que requiere de toda la multitud atributos se especifica en la documentación Type.GetType (como se ha señalado por Jason Malinowski en los comentarios):

Si typeName incluye el espacio de nombres, pero no el nombre de ensamblado, este método busca solo el ensamblado del objeto de llamada y Mscorlib.dll, en ese orden. Si typeName está totalmente calificado con el nombre del ensamblaje parcial o completo, este método busca en el ensamblaje especificado.Si el ensamblaje tiene un nombre fuerte, se requiere un nombre de ensamblaje completo.

+0

Sí, pero la calificación ** solo con el conjunto ** no funciona. Tengo que calificar con el conjunto, versión, cultura y token de clave pública. –

+0

El "nombre" completo del conjunto incluye los atributos Versión, Cultura, etc. –

+0

@Jason: siguiendo la documentación adicional, * El nombre de un tipo calificado para ensamblaje consiste en el nombre del tipo, incluido su espacio de nombre, seguido de una coma, seguido del nombre para mostrar del ensamblaje. * No se menciona que Cultura, etc. necesitado http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx –

Cuestiones relacionadas